微服务监控 - Grafana 使用教程

原文:https://makeoptim.com/service-mesh/prometheus-grafana

前面几篇文章我们使用 Prometheus 采集了各种各样的监控数据指标,并使用 promQL 语句查询出了一些数据,在 Prometheus 的 Dashboard 中进行了展示,但是明显可以感觉到 Prometheus 的图表功能相对较弱,所以一般情况下我们会一个第三方的工具来展示这些数据,也就是本篇文章要介绍的 Grafana

简介

Grafana 是一个跨平台的度量分析可视化工具,可以通过将采集的数据查询可视化展示,并及时警报

Grafana 具有可插拔数据源模型,支持许多流行的时间序列数据库,如 Graphite,Prometheus,Elasticsearch,OpenTSDB 和 InfluxDB。

特性

可以前往 https://play.grafana.org 体验 Grafana 特性。

可视化

快速灵活的可视化以及多种选择,使你可以以任何方式可视化数据。官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式。

动态仪表盘

使用模板变量创建动态且可重复使用的仪表板,这些模板变量显示在仪表板顶部。

探索指标

通过临时查询和动态明细浏览数据。拆分视图并排比较不同的时间范围,查询和数据源。

探索日志

快速搜索所有日志或实时流式传输(与 Loki 数据源配合使用效果最佳)。

警报

以可视方式定义最重要指标的警报规则。Grafana 将不断评估并向 Slack,PagerDuty,VictorOps 和 OpsGenie 等系统发送通知。

混合数据源

在同一张图中混合使用不同的数据源!你可以为每个查询指定数据源(适用于自定义数据源)。

注解

使用来自不同数据源的丰富事件注释图形。将鼠标悬停在事件上会显示完整的事件元数据和标签。

临时过滤器

临时过滤器允许您即时创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

安装

部署文件

# config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana
  namespace: observability
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.0.5"
data:
  grafana.ini: |
    [analytics]
    check_for_updates = true
    [grafana_net]
    url = https://grafana.net
    [log]
    mode = console
    [paths]
    data = /var/lib/grafana/data
    logs = /var/log/grafana
    plugins = /var/lib/grafana/plugins
    provisioning = /etc/grafana/provisioning

  datasources.yaml: |
    apiVersion: 1
    datasources:
    - access: proxy
      editable: true
      isDefault: true
      jsonData:
        timeInterval: 5s
      name: Prometheus
      orgId: 1
      type: prometheus
      url: http://prometheus:9090

注:

  • url: http://prometheus:9090 指定了 Prometheus 数据源地址,因为在同一个命名空间下,所以直接使用 service 名称访问。
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: observability
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.0.5"
spec:
  type: NodePort
  ports:
    - name: service
      port: 3000
      protocol: TCP
  selector:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana

注:

  • type: NodePort 为了在开发环境中方便访问,这里使用 NodePort 暴露服务。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: observability
  labels:
    app.kubernetes.io/name: grafana
    app.kubernetes.io/instance: grafana
    app.kubernetes.io/version: "7.0.5"
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: grafana
      app.kubernetes.io/instance: grafana
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app.kubernetes.io/name: grafana
        app.kubernetes.io/instance: grafana
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        runAsGroup: 472
        runAsUser: 472
      containers:
        - name: grafana
          image: "grafana/grafana:7.0.5"
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: config
              mountPath: "/etc/grafana/grafana.ini"
              subPath: grafana.ini
            - name: storage
              mountPath: "/var/lib/grafana"
            - name: config
              mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml"
              subPath: datasources.yaml
          ports:
            - name: service
              containerPort: 3000
              protocol: TCP
            - name: grafana
              containerPort: 3000
              protocol: TCP
          env:
            - name: "GF_SECURITY_ADMIN_PASSWORD"
              value: "admin123"
            - name: "GF_SECURITY_ADMIN_USER"
              value: "admin"
          livenessProbe:
            failureThreshold: 10
            httpGet:
              path: /api/health
              port: 3000
            initialDelaySeconds: 60
            timeoutSeconds: 30
          readinessProbe:
            httpGet:
              path: /api/health
              port: 3000
          resources: {}
      volumes:
        - name: config
          configMap:
            name: grafana
        - name: storage
          emptyDir: {}

注:

  • GF_SECURITY_ADMIN_USER 用户名
  • GF_SECURITY_ADMIN_PASSWORD 密码

部署

$ kubectl apply -f config.yaml
configmap/grafana created
$ kubectl apply -f deployment.yaml
deployment.apps/grafana created
$ kubectl apply -f service.yaml
service/grafana created

检查

$ kubectl get deployment -n observability
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
grafana      1/1     1            1           4m6s
httpbin      1/1     1            1           2d5h
prometheus   1/1     1            1           6d4h
redis        1/1     1            1           2d6h
$ kubectl get service -n observability
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
grafana         NodePort    10.96.124.67     <none>        3000:31273/TCP      4m10s
httpbin         ClusterIP   10.111.188.30    <none>        8000/TCP            2d5h
node-exporter   NodePort    10.111.82.119    <none>        9100:31672/TCP      3d5h
prometheus      NodePort    10.98.133.13     <none>        9090:31033/TCP      6d4h
redis           ClusterIP   10.104.118.216   <none>        6379/TCP,9121/TCP   2d6h

访问

根据服务端口访问 Grafana http://localhost:31273,并使用设置的用户名和密码登录。

image

Dashboard

导入 Dashboard

为了观察指标,我们可以根据自己的需求手动新建一个 Dashboard。除此之外,grafana 官网上还有很多公共的 Dashboard 可以选用。

由于在监控 Kubernetes 集群中我们讲解过使用 node_exporter 采集服务器节点的运行指标,所以下面以 Node Exporter for Prometheus Dashboard 为例讲解如何导入公共的 Dashboard。

点击 Import

image

输入Node Exporter for Prometheus Dashboard 的 id,并点击 Load

image

选择数据源并点击 Import 导入

image

查看 Dashboard

image

指标可视化流程

选择某个图表,右键选择 Edit

image

可以看到图表显示的值,其实是将指标通过计算而来的。

image

如上图,总 CPU 使用率是通过 100 - (avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[5m])) * 100) 计算得出的结果。而 node_cpu_seconds_total 便是使用 node_exporter 采集到的服务器节点指标中的一个。

所以,指标可视化流程是,先配置 Prometheus 采集想要的指标,然后使用 promQL 语句查询出想要的数据,最后通过 Grafana 可视化

如果grafana 官网的 Dashboard 不能满足要求,也可以新建一个自定义 Dashboard,具体的 promQL 语句参考导入的 Dashboard 即可,这里不再赘述。

报警

报警是监控系统中必不可少的环节,grafana 支持很多种形式的报警功能,比如 email、钉钉、slack、webhook 等等,下面我们以钉钉为例。

钉钉

设置报警前,需要设置下钉钉通知参数。

image

注:这里需要注意的是,Grafana 的钉钉通知没有新版机器人的加签设置,所以推荐使用自定义关键词(由于这里做报警的,每个通知消息都会包含 alert, 所以关键字可设置为 alert)。

image

Graph

目前,只有 Graph 支持报警功能。下面新建一个 Dashbaord,在里面创建 Graph。

image

如上图,设置的指标值为 (1 - avg(irate(node_cpu_seconds_total{job=~"kubernetes-node-exporter",mode="idle"}[5m])) by (instance)) * 100 表示节点 cpu 总平均使用率。然后,点击 Alert,创建一个报警。

image
image

如上图,为了便于触发通知,这里设置了当 cpu 总平均使用率高于 10% 的时候通知到钉钉群。

完成配置后,等到 Rule 周期到的时候(上面设置了 5 分钟),就能在钉钉群中收到报警。

image

小结

本篇为大家介绍了如何使用 Grafana 可视化 Prometheus 收集到的指标,并设置报警。

注:本章内容涉及的 yaml 文件可前往 https://github.com/MakeOptim/service-mesh/prometheus 获取。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容