• k8s上搭建loki日志服务并通过prometheus进行错误日志告警


    1. 前言

    prometheus 和 loki的基础概念就不赘述了,如需查看请先移步到官网
    prometheus -> https://prometheus.io/
    loki -> https://grafana.com/oss/loki/

    2. 要解决的问题

    之前测试环境搭建Loki采集日志没有设置ERROR级别告警的需求,现在正式环境需要添加日志告警了,最开始是直接通过grafana面板自带的告警,但是感觉不太好使(也许是我配置的问题,很多本该告警的时候没有告警),所以还是通过prometheus结合自己写的hook来进行告警

    这里也简单说下grafana上添加Loki日志告警需要注意的一点:

    1. 添加datasource 选择prometheus 但是在填写路径的时候并不是直接 http://loki地址:3100 而是 http://loki地址:3100/loki
    2. 规则什么的比较简单 eg: count_over_time({container="xy-xxxx"} |= "INFO"[1m]) 就是查询一分钟container="xy-xxxx"日志中包含了INFO关键字的个数

    3. 进入正题

    loki 和 Prometheus-operator 的安装可以参考 https://www.infracloud.io/blogs/grafana-loki-log-monitoring-alerting/

    这篇只说在过程中需要注意的问题

    1. 我按照https://www.infracloud.io/blogs/grafana-loki-log-monitoring-alerting/ 教程中自定义的values.yaml文件会出现一些错误,所以我直接修改的helm包里面具体的字段 ,然后安装没有问题
    2. 需要增加自定义应用日志筛选

    自定义应用日志筛选思路

    首先要理清日志从打印到告警的整个过程是怎样的

    1. 日志是loki中的promtail来负责的,所以如果需要对日志做筛选的工作那么就要在promtail这里来完成
    2. prometheus要获取到日志的告警指标,我们知道prometheus是通过抓取目标的/metrics来获取数据的,所以在promtail这里做日志筛选时就需要将自定义的指标暴露给prometheus
      在loki的官网中会发现有个pipeline_stages 和metrics两个配置(我们的参考链接中也有提到这个,但并没有说为什么要这么做,我也是看了官网才知道),可以满足我们的需求
    3. prometheus通过promtail的/metrics获取到信息后,需要设置告警rules ,因为之前我们是用prometheus-operator来搭建的,所以直接edit对应的rules文件是不能达到目的的,所以这里又涉及到自定义prometheus rules的步骤 这个可以参照我之前写的笔记 https://www.cnblogs.com/zunwen/p/14023248.html
    4. helm安装的loki中promtail 的configmap.yaml文件中 有关kubernetes_sd_config段的配置,很多感觉都没用,下个步骤将贴下我现在用配置

    有了思路直接贴配置也能看懂

    promtail values.yaml

    extraScrapeConfigs:
    - job_name: sm-operation-logs
      pipeline_stages:
        - docker: {}
        - match:
            selector: '{app="sm-operation"}'
            stages:
            - regex:
                expression: '.*(?P<smoperation>ERROR.*)'
            - metrics:
                sm_operation_logs:
                  config:
                    action: inc
                  description: too many ERROR logs
                  source: smoperation
                  type: Counter
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - action: drop
        regex: ''
        source_labels:
        - __meta_kubernetes_pod_annotation_kubernetes_io_config_mirror
        - __meta_kubernetes_pod_label_name
        - __meta_kubernetes_pod_label_app
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_label_component
        target_label: __service__
      - action: keep
        regex: '[0-9a-z-.]+-[0-9a-f]{8,10}'
        source_labels:
        - __meta_kubernetes_pod_controller_name
      - action: replace
        regex: '([0-9a-z-.]+)-[0-9a-f]{8,10}'
        source_labels:
        - __meta_kubernetes_pod_controller_name
        target_label: __service__
      - source_labels:
        - __meta_kubernetes_pod_node_name
        target_label: __host__
      - action: drop
        regex: ''
        source_labels:
        - __service__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: replace
        replacement: $1
        separator: /
        source_labels:
        - __meta_kubernetes_namespace
        - __service__
        target_label: job
      - action: replace
        source_labels:
        - __meta_kubernetes_namespace
        target_label: namespace
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_name
        target_label: pod
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_container_name
        target_label: container
      - replacement: /var/log/pods/*$1/*.log
        separator: /
        source_labels:
        - __meta_kubernetes_pod_annotation_kubernetes_io_config_mirror
        - __meta_kubernetes_pod_container_name
        - __meta_kubernetes_pod_uid
        target_label: __path__
    

    prometheusRules

    apiVersion: monitoring.coreos.com/v1
    kind: PrometheusRule
    metadata:
      labels:
        app: prometheus-operator
        release: prometheus
      name: customize-rules
      namespace: kube-mon
    spec:
      groups:
      - name: customize-rules
        rules:
        - alert: sm-operation-logs
          annotations:
            description: "total error logs of sm-operation over count {{ $value }}"
            summary: 错误日志量一分钟内大于1
          expr: sum(increase(promtail_custom_sm_operation_logs[1m])) > 1
          for: 1m
          labels:
            serverity: critical
    

    prometheus dashboard上查看效果

    如若对你有帮助,我不嫌弃你给我撒点小费哟 哈哈 也可加个好友哟 viva8293 另外请备注来自博客园哦

  • 相关阅读:
    forward和redirect的区别
    转 jsp中 session的简单用法
    20_学生选课数据库SQL语句练习题1
    _学生选课数据库SQL语句练习题
    输入输出2
    接口提
    输入输出流3
    获取当前时间并显示在网页上
    简单的权限管理
    java关于时间
  • 原文地址:https://www.cnblogs.com/zunwen/p/14080696.html
Copyright © 2020-2023  润新知