Prometheus安装使用与快速入门

Prometheus监控

一、Prometheus概念

Prometheus(由go语言(golang)开发)是一套开源的监控&报警&时间序列数据库的组合。适合监控docker容器。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。

时间序列数据(TimeSeries Data) : 按照时间顺序记录系统、设备状态变化的数据被称为时序数据。

Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间。

  • Prometheus特点

    多维度数据模型。

    灵活的查询语言。

    不依赖分布式存储,单个服务器节点是自主的。

    以HTTP方式,通过pull模型拉去时间序列数据。

    也可以通过中间网关支持push模型。

    通过服务发现或者静态配置,来发现目标服务对象。

    支持多种多样的图表和界面展。

  • Prometheus架构

在这里插入图片描述

  • Prometheus组件
    Prometheus Server:采集、存储、告警分析时序数据。
    client libaries:提供应用程序的数据收集功能。
    pushgateway:jobs推送数据给pushgateway,再由pushgateway暴露给Prometheus Server。
    exporters:暴露第三方服务的采集数据。
    alertmanager:对Prometheus Server产生的告警进行去重、分组、发送等功能。

  • Prometheus监控流程

    step1:Prometheus通过Service discovery发现采集目标

    step2:使用HTTP请求采集(pull/push)目标指标数据,并进行持久化。

    step3:定时运行本地规则进行数据聚合产生新的时序数据或告警。

    step4:将告警发送于Alertmanager,由它进行分组、去重等功能后发送告警通知或恢复通知。

    step5:可以调用Prometheus Server提供的HTTP API获取采集数据用于可视化。

  • Prometheus使用场景

    Prometheus可以记录任何纯数据的时序数据;

    Prometheus常用于以机器为中心的监控、面向高度动态的服务体系架构监控;

    不适合100%准确性的要求,比如计费。

二、Prometheus安装使用

Prometheus官网安装包下载:https://prometheus.io/download/

1.安装

Prometheus服务:用于监控其它所有机器或服务的监控指标。

node_exporter服务:用于上报机器的监控指标。

mysqld_exporter服务:用于上报mysql服务的监控指标。

1.Prometheus服务
  • step1:解压下载好的安装包

    tar xf prometheus-2.5.0.linux-amd64.tar.gz
    mv prometheus-2.5.0.linux-amd64 /usr/local/prometheus
    
  • step2:直接使用默认配置启动

    cd /usr/local/prometheus
    /usr/local/prometheus/prometheus --config.file="/usr/local/prometheus/prometheus.yml" &
    
  • step3:浏览器访问 http://服务器IP:9090 可以查看监控页面。访问http://服务器IP:9090/metrics可以查看监控数据。

2.node_exporter服务

目前为止,只能监控当前机器。要想监控远程机器,需要在远程机器上安装node_exporter组件。

  • step1:解压下载好的安装包

    tar xf node_exporter-0.16.0.linux-amd64.tar.gz
    mv node_exporter-0.16.0.linux-amd64 /usr/local/node_exporter
    
  • step2:后台启动node_exporter

    nohup /usr/local/node_exporter/node_exporter &
    
  • step3:回到安装Prometheus服务的机器,在配置文件末添加node_exporter服务。

    vim /usr/local/prometheus/prometheus.yml
    ##在文本末添加如下配置
    - job_name: 'agent1' # 取一个job名称来代 表被监控的机器 
      static_configs:
      - targets: ['192.168.168.102:9100'] # 这里改成被监控机器的IP,后面端口9100
    
  • step4:重启Prometheus服务

    ##先关闭旧进程
    ps -ef|grep prometheus
    kill -9 prometheus进程号
    pkill prometheus
    ##重启
    /usr/local/prometheus/prometheus --config.file="/usr/local/prometheus/prometheus.yml" &
    
  • step5:浏览器访问http://服务器IP:9090可以查看监控页面。(现在多了一个监控目标)

3.mysqld_exporter服务
  • step1:解压下载好的安装包。

    tar xf mysqld_exporter-0.11.0.linux-amd64.tar.gz
    mv mysqld_exporter-0.11.0.linux-amd64 /usr/local/mysqld_export
    
  • step2:登录已安装的mysql,进行用户授权

    grant select,replication client,process ON *.* to 'mysql_monitor'@'localhost' identified by 'Aa123456';
    flush privileges;
    ## 在/etc/my.cnf文件中配置好用户登录信息,如下:
    [client] 
    user=mysql_monitor 
    password=Aa123456
    

    原理:prometheus服务器找mysql_exporter,mysql_exporter再找mysql获取监控指标数据。

  • step3:后台启动mysqld_export服务

    nohup /usr/local/mysqld_exporter/mysqld_exporter --config.mycnf=/etc/my.cnf &
    ## mysqld_export服务默认通过9104端口进行上报监控
    
  • step4:回到安装Prometheus服务的机器,在配置文件末添加mysqld_exporter服务。

    vim /usr/local/prometheus/prometheus.yml
    ##在文本末添加如下配置
    - job_name: 'mysqld-agent1' # 取一个job名称来代表被监控的服务
      static_configs:
      - targets: ['192.168.168.101:9104'] # 这里改成mysqld服务所在机器的IP,端口9104
    
  • step5:重启Prometheus服务

    ##先关闭旧进程
    ps -ef|grep prometheus
    kill -9 prometheus进程号
    pkill prometheus
    ##重启
    /usr/local/prometheus/prometheus --config.file="/usr/local/prometheus/prometheus.yml" &
    
  • step6:浏览器访问http://服务器IP:9090(现在又多了一个监控目标)

4.Grafana服务

Grafana官网安装教程请访问:https://grafana.com/

Grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警。

2.PromSQL

Prometheus提供PromSQL功能用于时序数据的查询和统计。

举例如下:

prometheusURL: "http://127.0.0.1:30065"
  metrics:
  - name: metric_cpu_usage_ratio
    descritpion: CPU使用率
    expr: (rate(container_cpu_usage_seconds_total{container="mysql", alertingTargetName="{{.Name}}", namespace="{{.Namespace}}"}[5m]) / ignoring(cpu) (container_spec_cpu_quota / 100000)) * 100
  - name: metric_memory_usage_ratio
    descritpion: 内存使用率
    expr: (container_memory_rss{container="mysql", alertingTargetName="{{.Name}}", namespace="{{.Namespace}}"}/container_spec_memory_limit_bytes)*100
  - name: health
    description: 实例的健康状态
    expr: mysql_up{AppName="{{.Name}}", namespace="{{.Namespace}}"}
  - name: metric_mysql_storage_iops
    description: 实例每秒读写的IO数(IOPS)
    expr: sum(rate(container_fs_writes_total{container="mysql", alertingTargetName="{{.Name}}", namespace="{{.Namespace}}"}[5m])) by (namespace,pod,container)
      + sum(rate(container_fs_reads_total{container="mysql", alertingTargetName="{{.Name}}", namespace="{{.Namespace}}"}[5m])) by (namespace,pod,container)
  - name: metric_mysql_tps
    description: 实例每秒的事务数(TPS)
    expr: sum(rate(mysql_global_status_commands_total{command=~"(commit|rollback)", AppName="{{.Name}}", namespace="{{.Namespace}}"}[5m])) by (namespace,instance)
  - name: metric_mysql_qps
    description: 实例平均每秒SQL的执行次数(QPS)
    expr: sum(rate(mysql_global_status_commands_total{AppName="{{.Name}}", namespace="{{.Namespace}}"}[5m])) by (namespace,instance)
    - name: metric_mysql_threads_connected
    description: 实例当前总连接数
    expr: mysql_global_status_threads_connected{AppName="{{.Name}}", namespace="{{.Namespace}}"}
  - name: metric_mysql_threads_running
    description: 实例当前活跃
    expr: mysql_global_status_threads_running{AppName="{{.Name}}", namespace="{{.Namespace}}"}
  - name: metric_mysql_storage_volume_util
    description: 存储空间使用率
    expr: 100 * sum(mysql_filesystem_used_bytes{AppName="{{.Name}}", namespace="{{.Namespace}}"}) by (namespace,instance) /
      sum(mysql_filesystem_size_bytes{AppName="{{.Name}}", namespace="{{.Namespace}}"}) by (namespace,instance)

3.prometheus.yml配置

  • prometheus.yml配置举例
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'agent1'
    static_configs:
    - targets: ['192.168.168.101:9100']
  - job_name: 'agent2'
    static_configs:
    - targets: ['192.168.168.102:9100']
  - job_name: 'mysql'
    static_configs:
    - targets: ['192.168.168.101:9104']
  • prometheus.yml操作举例
package main

import (
	"fmt"
	"gopkg.in/yaml.v2"
	"log"
	"os"
)

type PrometheusConfig struct {
	Global        interface{}     `yaml:"global"`
	Alerting      interface{}     `yaml:"alerting"`
	RuleFiles     []string        `yaml:"rule_files"`
	ScrapeConfigs []*ScrapeConfig `yaml:"scrape_configs"`
}

type ScrapeConfig struct {
	JobName       interface{} `yaml:"job_name"`
	StaticConfigs interface{} `yaml:"static_configs"`
	//StaticConfigs interface{} `yaml:"static_configs,omitempty"`
}

func NewScrapeConfig(job string) *ScrapeConfig {
	return &ScrapeConfig{
		JobName: job,
	}
}

func main() {
	open, err := os.Open("./Prometheus.yaml")
	if err != nil {
		log.Fatal(err)
	}
	defer open.Close()
	decoder := yaml.NewDecoder(open)
	var config PrometheusConfig
	err = decoder.Decode(&config)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%#v\n", config)
	//----------------------------------------------------------
	// 修改scrapeConfig
	scrapeConfig := NewScrapeConfig("mysqld")
	config.ScrapeConfigs = append(config.ScrapeConfigs, scrapeConfig)
	//----------------------------------------------------------
	// 拷贝yaml文件
	create, err := os.Create("./Prometheus_copy.yaml")
	if err != nil {
		log.Fatal(err)
	}
	defer create.Close()
	encoder := yaml.NewEncoder(create)
	err = encoder.Encode(config)
	if err != nil {
		log.Fatal(err)
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的程序猿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值