監視システムのプロメテウス+グラファナの実践

プロメテウス環境の構築と実践

1.コンポーネントの準備とインストール

次のソフトウェアはdockerを使用してインストールされます。dockerコマンドについては、docker-エントリから練習までを参照してください。

1.1 Prometheus +クリックハウスのインストール

# prometheus安装并启动,访问地址localhost:9090
docker pull prom/prometheus
docker run -d -p 9090:9090 prom/prometheus
# 或者指定配置路径
docker run -d -p 9090:9090 -v /home/webedit/monitoring/prometheus/config:/etc/prometheus prom/prometheus

# alertmanager安装并启动,访问地址localhost:9093
docker pull prom/alertmanager
docker run --name alertmanager -d -p 9093:9093 quay.io/prometheus/alertmanager

# grafana安装并启动, 访问地址localhost:3000
docker pull grafana/grafana
docker run -d -p 3000:3000 grafana/grafana

# pushgateway安装并启动,访问地址localhost:9091
docker pull prom/pushgateway
docker run -d -p 9091:9091 prom/pushgateway

# clickhouse安装并启动,用于grafana读取。外网访问地址ip:8123。用于测试grafana集成clickhouse
docker pull yandex/clickhouse-server
docker pull yandex/clickhouse-client
docker run -d --name clickhouse-server -p 8123:8123 -p 9009:9009 -p 9000:9000 --ulimit nofile=262144:262144 --volume=/home/webedit/monitoring/clickhouse/clickhouse-db:/var/lib/clickhouse yandex/clickhouse-server
# 使用clickhouse-client连接
docker run -it --rm --link clickhouse-server:clickhouse-server yandex/clickhouse-client --host clickhouse-server

# 以上组件/软件安装启动后可以先访问下地址看看有没有异常

1.2grafanaインストールプラグイン

# grafana默认是没有clickhouse的数据源插件的,需要安装
# 进入grafana容器,使用grafana-cli plugins install命令安装插件,然后重启容器生效
docker exec -it `docker container ls | grep grafana | awk -F' ' '{print $1}'` bash
grafana-cli plugins install vertamedia-clickhouse-datasource
docker restart `docker container ls | grep grafana | awk -F' ' '{print $1}'`

grafanaにデータソースを追加し、クリックハウスを選択します。デフォルト構成を使用している場合は、URLとユーザーurl:(ip:8123)、user:defaultを入力するだけです。

画像-20210318164357956

2.プロメテウスのユースケース

2.1ケース1:システム監視ノードエクスポータ

  • 監視対象のマシンでnode-exporterを起動します
# 按照上面的流程启动完后,已经可以监控一些指标了。
# 另外再加一个官方案例:使用NODE EXPORTER监视LINUX主机指标
docker pull prom/node-exporter
docker run -d -p 9100:9100 \
  -v "/proc:/host/proc:ro" \
  -v "/sys:/host/sys:ro" \
  -v "/:/rootfs:ro" \
  --net="host" \
  --restart=always \
  --name node-exporter \
  prom/node-exporter
  • prometheus.ymlをキャプチャするようにモニタリングインジケーターを構成します(prometheus、alertmanager、pushgateway自体もインジケーターデータを公開し、一緒に追加します〜)
# prometheus指标抓取配置

# 全局配置
global:
  # 抓取周期
  scrape_interval:     15s
  # 默认抓取超时 [ scrape_timeout: <duration> | default = 10s ]
  # 估算规则的默认周期 # 每15秒计算一次规则。默认1分钟 [ evaluation_interval: <duration> | default = 1m ]
  # 和外部系统(例如AlertManager)通信时为时间序列或者警情(Alert)强制添加的标签列表
	external_labels:
    monitor: 'gucha-monitor'
# 规则文件列表  
rule_files:
  - 'prometheus.rules.yml'
# 抓取配置列表
scrape_configs:
  # 监控自身指标
  - job_name: 'prometheus'
  	# 抓取的时间间隔
    scrape_interval: 5s
    # 静态指定服务地址。生产环境一般用服务发现,这里用于演示
    static_configs:
      - targets: ['10.224.192.113:9090']

  # node-exporter 指标
  - job_name:       'node'
		# 指定job的抓取时间周期,可以覆盖全局配置
    scrape_interval: 5s
    static_configs:
      # 这里加了两个不存在的服务,测试prometheus健康检查
      - targets: ['localhost:8080', 'localhost:8081']
        labels:
          group: 'not_exist'
      - targets: ['10.224.192.113:9100']
        labels:
          group: 'node_demo'
          
  - job_name: 'pushgateway'
    static_configs:
      - targets: ['10.224.192.113:9091']
        labels:
          instance: pushgateway

  - job_name: 'alertmanager'
    static_configs:
      - targets: ['10.224.192.113:9093']
        labels:
          instance: alertmanager
  • ここで、node-exporter + grafanaを使用して、見栄えの良いシステムインジケーター監視ダッシュボードを統合します
1. 在grafana官网中找个好看的dashboard模板,[dashboard](https://grafana.com/grafana/dashboards). 找到自己喜欢的,点进去会有个模板id. 这里找了一个8919的[模板](https://grafana.com/grafana/dashboards/8919)
2. 在grafana中import模板,并选择prometheus数据源,就生成了一个很好看的dashboard了

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-xpE9wrcX-1616636283402)(https://raw.githubusercontent.com/1458428190/ prometheus-demo / main / images /image-20210318170022275.png)]

2.2ケース2:アプリケーション監視clickhouse-exporter

  • clickhouse-exporterを起動し、clickhouseのURLを構成して、クロールジョブを追加します
# 启动clickhouse-exporter
docker pull f1yegor/clickhouse-exporter
docker run -d -p 9116:9116 f1yegor/clickhouse-exporter -scrape_uri=http://10.224.192.113:8123/

# 添加抓取工作
  - job_name: 'clickhouse-metrics'
    static_configs:
      - targets: ['10.224.192.113:9116']
        labels:
          instance: clickhouse
  • grafanaの公式ウェブサイトで素敵なダッシュボードテンプレートを見つけてください、id:882

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-J7Atq0Rw-1616636283404)(https://raw.githubusercontent.com/1458428190/ prometheus-demo / main / images /image-20210318170512727.png)]

2.3ケース3:eurekaに基づくSpringBootの監視

  • prometheus.ymlにサービスディスカバリを追加します

      # 使用eureka_sd_configs做服务发现。 缺点:需要在项目里改点配置
      - job_name: 'eureka'
        metrics_path: '/admin/prometheus'
        # Scrape Eureka itself to discover new services.
        eureka_sd_configs:
          - server: http://10.224.192.92:1111/eureka
        relabel_configs:
          - source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
            action: replace
            regex: ([^:]+)(?::\d+)?;(\d+)
            replacement: $1:$2
            target_label: __address__
    
  • SpringBootプロジェクト紹介パッケージ

    # SpirngBoot项目引入包
    <!-- 第三方开源工具包 -->
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-core</artifactId>
      <version>1.1.2</version>
    </dependency>
    
  • インジケーターアプリケーションの名前を指定します

    # 指定指标应用名和管理端口
    management.metrics.tags.application=${spring.application.name}
    
  • 管理ポートを指定します(サービス検出はデフォルトでサービスポートを検出し、SprintBootによって公開される管理ポートは別のものであるため)

       eureka:
      	instance:
        	metadataMap:
          	"prometheus.port": "${management.server.port}"
    
  • 別の構成方法。サービス検出にconsul_sd_configsを使用します[実践されていません]

     - job_name: 'consul-prometheus'
        scheme: http
        metrics_path: '/admin/prometheus'
        consul_sd_configs:
        #consul 地址
          - server: '10.224.192.92:1111'
            scheme: http
            services: [SPRINGBOOT_PROMETHEUS_CLIENT]
    
  • id:11378などのグラファナ公式ウェブサイトで見栄えの良いダッシュボードテンプレートを見つけてください

    [外部リンク画像の転送に失敗しました。元のサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-wO6FWAZ5-1616636283405)(https://raw.githubusercontent.com/1458428190/ prometheus-demo / main / images /image-20210318171821693.png)]

3.alertmanagerのユースケースを使用したPrometheus

  • アラームルールを構成するprometheus.rule.yml

    1. 10.224.192.113:9100インスタンスでのディスクの30秒の書き込み速度が1分間で60を超えました。条件をトリガーした後、生成されたアラームレコードは、重大度などのいくつかの使用可能なタグを追加します。後続のグループ化を容易にするためにわずかです。

    2. 10.224.192.113:9100インスタンスでのディスクの30秒の書き込み速度が1分間で70を超えました。トリガー条件の後、生成されたアラームレコードには、重大度などの使用可能なタグが追加されます。後続のグループ化を容易にするために重要です。

    3. 残りの構成〜メモを参照

groups:
- name: example
  rules:
  # 告警名称
  - alert: node_disk_reads_completed_total
    # promQL  10.224.192.113:9100实例下的磁盘30s写速率超过60
    expr: rate(node_disk_writes_completed_total{
    
    instance="10.224.192.113:9100"}[30s]) > 60
    # 持续1分钟
    for: 1m
    # 标签,比如加个严重程度
    labels:
      severity: slight
    # 告警模板内容
    annotations:
      summary: "summary test {
    
    { $labels.instance }} slight"
      description: "{
    
    { $labels.instance }} rate(node_disk_writes_completed_total) = {
    
    { $value }})"
  - alert: node_disk_reads_completed_total
    # promQL 10.224.192.113:9100实例下的磁盘30s写速率超过70
    expr: rate(node_disk_writes_completed_total{
    
    instance="10.224.192.113:9100"}[30s]) > 70
    # 持续1分钟
    for: 1m
    # 标签
    labels:
      severity: critical
    annotations:
      summary: "summary test {
    
    { $labels.instance }} critical"
      description: "{
    
    { $labels.instance }} rate(node_disk_writes_completed_total) = {
    
    { $value }})"
  • alertmanager配置alertmanager.yml
global:
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: '[email protected]'
  smtp_auth_username: '[email protected]'
  smtp_auth_password: 'FAMAPDNAOUPJMMOV'
  smtp_require_tls: false
route:                                          #每个输入警报进入根路由
  receiver: 'team-b'                      			#根路由不得包含任何匹配项,因为它是所有警报的入口点
  group_by: ['alertname', 'instance']           #将传入警报分组的标签。例如,将alertname和instance值相同的分为同一个组
  group_wait: 30s                               #当传入的警报创建了一组新的警报时,请至少等待多少秒发送初始通知
  group_interval: 5m                            #发送第一个通知时,请等待多少分钟发送一批已开始为该组触发的新警报
  repeat_interval: 3h                           #如果警报已成功发送,请等待多少小时以重新发送警报
  routes:                                       #子路由,父路由的所有属性都会被子路由继承
  - match_re:                                   #此路由在警报标签上执行正则表达式匹配,以捕获与服务列表相关的警报
     severity: ^(slight|critical)$
    receiver: team-a
    routes:                                     #服务有严重警报,任何警报子路径不匹配,即通过父路由配置直接发送给收件人
    - match:
        severity: critical
      receiver: team-b
#如果另一个警报正在触发,则禁止规则允许将一组警报静音,如果同一警报已经严重,我们将使用此选项禁用任何警告级别的通知
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'slight'
  equal: ['alertname']
#如果警报名称相同,则应用抑制,如果源警报和目标警报中均缺少“equal”中列出的所有标签名称,则将应用禁止规则!
receivers:
- name: 'team-a'
  email_configs:
  - to: '[email protected],[email protected]'
- name: 'team-b'
  email_configs:
  - to: '[email protected]'
  # 配置钩子,扩展通知方式
  # webhook_configs:
  # - url: 'http://prometheus-webhook-dingtalk.kube-ops.svc.cluster.local:8060/dingtalk/webhook1/send'
  #   send_resolved: true
  • 構成を使用してalertmanagerを起動し、構成ファイルを指定します
docker run -d -p 9093:9093 -v /home/webedit/monitoring/alertmanager/config/alertmanager.yml:/etc/alertmanager/config.yml --name alertmanager quay.io/prometheus/alertmanager --config.file=/etc/alertmanager/config.yml
  • prometheusとalertmangerを関連付けます。prometheus.ymlを追加します
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['10.224.192.113:9093']

4.ビジネス指標モニタリングケース

  • SpringBoot + eurekaに基づくデモケース。導入する必要のあるパッケージと構成は、上記の「eurekaに基づくSpringBoot実装の監視」と同じです。
// 上报瞬时指标,这段代码可以周期运行。等待prometheus server拉取。
Metrics.gauge("mp.mkt.automkt.cnt.gauge", ImmutableList.of(new ImmutableTag("jobType", "vipUserMktJob")), 	
              RandomUtil.randomLong(19000, 25000)));
Metrics.gauge("mp.mkt.automkt.cnt.gauge", ImmutableList.of(new ImmutableTag("jobType", "dwUserMktJob")), 
              RandomUtil.randomLong(19000, 25000)));
  • grafanaビューを追加

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-1ODfSkzW-1616636283407)(https://raw.githubusercontent.com/1458428190/ prometheus-demo / main / images /image-20210318173825123.png)]

  • アラームルールを設定します。その影響については注意事項を参照してください〜
  # 营销系统业务告警
  - alert: mkt-alert
    # promQL vip自动化营销触发数,过去5分钟平均值小于2w
    expr: avg(mp_mkt_automkt_cnt_gauge{
    
    jobType="vipUserMktJob"}[5m]) < 25000
    # 添加告警标签
    labels:
      severity: slight
      type: automkt
    annotations:
      summary: "vip自动化营销近5分钟内平均触发数低于25000,severity: slight"
      description: "vip自动化营销近5分钟内平均触发数 = {
    
    { $value }})"
  - alert: mkt-alert
    # promQL
    expr: avg(mp_mkt_automkt_cnt_gauge{
    
    jobType="vipUserMktJob"}[5m]) < 20000
    # 持续1分钟
    for: 1m
    # 标签
    labels:
      severity: critical
      type: automkt
    annotations:
      summary: "vip自动化营销近5分钟内平均触发数低于20000,severity: critical"
      description: "vip自动化营销近5分钟内平均触发数 = {
    
    { $value }})"
 	- alert: mkt-alert
    # promQL
    expr: avg(mp_mkt_automkt_cnt_gauge{
    
    jobType="dwUserMktJob"}[5m]) < 200000
    # 持续1分钟
    for: 1m
    # 标签
    labels:
      severity: slight
      type: automkt
    annotations:
      summary: "plus自动化营销数据异常,severity: slight"
      description: "触发数:{
    
    { $value }})"
  • アラーム設定は、以前の設定に基づいて部分的に変更されています。
global:
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: '[email protected]'
  smtp_auth_username: '[email protected]'
  smtp_auth_password: 'FAMAPDNAOUPJMMOV'
  smtp_require_tls: false
route:                                          #每个输入警报进入根路由
  receiver: 'team-b'                            #根路由不得包含任何匹配项,因为它是所有警报的入口点
  group_by: ['alertname', 'instance']           #将传入警报分组的标签。将alertname和instance值相同的分为同一个组
  group_wait: 30s                               #等待30秒发送初始通知,用于聚合同一个分组的报警信息
  group_interval: 5m                            #分组执行报警逻辑的时间周期
  repeat_interval: 3h                           #如果警报已成功发送,请等待多少小时以重新发送警报
  routes:                                       #子路由,父路由的所有属性都会被子路由继承
  - match_re:                                   #正则匹配 标签severity=slight或者critical
     severity: ^(slight|critical)$
    receiver: team-a
    routes:                                     #严重警报,通知给team-b
    - match:
        severity: critical
      receiver: team-b
      routes:																		#自动化营销的严重报警,通知给team-automkt
      - match:
          alertname: mkt-alert
          type: automkt
        receiver: team-automkt

#同一个alertname,如果已经出过严重的报警,就屏蔽轻微的报警
#抑制规则
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'slight'
  equal: ['alertname']
#如果警报名称相同,则应用抑制,如果源警报和目标警报中均缺少“equal”中列出的所有标签名称,则将应用禁止规则!

receivers:
- name: 'team-a'
  email_configs:
  - to: '[email protected],[email protected]'
- name: 'team-b'
  email_configs:
  - to: '[email protected]'
# 自动化营销相关负责人
- name: 'team-automkt'
  email_configs:
  - to: '[email protected],[email protected]'
  # 配置钩子,扩展通知方式
  # webhook_configs:
  # - url: '短信 popo'
  #   send_resolved: true
  • Alertmanagerアラームの例。バックグラウンドで表示できます(このバックグラウンドはサイレントルールで構成することもできます)

画像-20210318174250098

5.プッシュゲートウェイのユースケース

<!-- 引入包 -->
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_pushgateway</artifactId>
    <version>0.10.0</version>
</dependency>
String url = "10.224.192.113:9091";
CollectorRegistry registry = new CollectorRegistry();
Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.").create();
guage.set(23.12);
guage.register(registry);
PushGateway pg = new PushGateway(url);
Map<String, String> groupingKey = new HashMap<String, String>();
groupingKey.put("instance", "my_instance");
pg.pushAdd(registry, "my_job", groupingKey);


String url = "10.224.192.113:9091";
CollectorRegistry registry = new CollectorRegistry();
Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.").labelNames("app", "date").create();
String date = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
guage.labels("my-pushgateway-test-0", date).set(25);
guage.labels("my-pushgateway-test-1", date).dec();
guage.labels("my-pushgateway-test-2", date).dec(2);
guage.labels("my-pushgateway-test-3", date).inc();
guage.labels("my-pushgateway-test-4", date).inc(5);
guage.register(registry);
PushGateway pg = new PushGateway(url);
Map<String, String> groupingKey = new HashMap<>();
groupingKey.put("instance", "my_instance");
pg.pushAdd(registry, "my_job", groupingKey);

備考:

prometheus.rule.yml和alertmanager.yml配置有点麻烦
grafana可以配置alertmanager报警

おすすめ

転載: blog.csdn.net/qq_31281327/article/details/115196737