前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Grafana基础介绍与可视化快速入门

Grafana基础介绍与可视化快速入门

作者头像
全栈工程师修炼指南
发布2022-09-28 18:47:06
发布2022-09-28 18:47:06
3.7K00
代码可运行
举报
运行总次数:0
代码可运行

[TOC

0x00 前言简述

1) Grafana 介绍

描述: Grafana是一个用Javascript写的开源的(Dashboard)可视化面板,能齐全的度量仪表盘和图形编辑器和漂亮的布局展示,并且支持Graphite、elasticsearch、zabbix等的数据可视化的实现,可以给你的数据换个皮肤,使你的数据展示更加直观和漂亮。

2) Grafana 专有术语介绍

  • 仪表盘面板: Grafana 数据展示的界面,里面的面板是包含图形、表格或其它可视信息的矩形区域。
  • 数据源: Grafana 从数据源中获取用来绘图的信息,它目前支持主流开箱即用的数据源,例如OpenTSDB、PostgreSQL,我们的Prometheus就是采用TSDB时序数据库。

3) Grafana 学习参考

Grafana官网链接,内含各种官方文档(包括仪表盘设置等): http://docs.grafana.org/installation/rpm/

项目地址: https://github.com/grafana/grafana/ 官方地址: https://grafana.com

0x01 安装部署

1.CentOS7安装Grafana

安装环境: CentOS Linux release 7.6.1810 (Core) 3.10.0-957.10.1.el7.x86_64

安装实践

1.yum方式安装grafana最新版本6.1.6

代码语言:javascript
代码运行次数:0
运行
复制
wget https://dl.grafana.com/oss/release/grafana-6.1.6-1.x86_64.rpm
sudo yum localinstall grafana-6.1.6-1.x86_64.rpm

#安装好后守护进程重启
$ systemctl daemon-reload
$ systemctl start grafana-server
$ systemctl enable grafana-server

#初始化插件安装
$ yum -y install fontconfig freetype* urw-fonts  #服务器端图像是一项可选功能
$ systemctl start grafana-server

2.docker方式安装,注意默认安装最新版本

代码语言:javascript
代码运行次数:0
运行
复制
docker run -d --name=grafana -p 3000:3000 grafana/grafana 

tee docker-compose.yml <<'EOF'
version: '3.2'
services:
  grafana:
    image: grafana/grafana:7.5.5
    container_name: grafana
    user: "472"
    environment:
      - TZ=Asia/Shanghai
      - GF_SECURITY_ADMIN_PASSWORD=weiyigeek
    volumes:
      - /nfsdisk-31/monitor/grafana/data:/var/lib/grafana
      - /etc/localtime:/etc/localtime
    ports:
      - '3000:3000'
    restart: always
    dns:
      - 223.6.6.6
      - 192.168.12.254
EOF

3.二进制方式安装Grafana,安装完成后访问主机的3000端口即可,

代码语言:javascript
代码运行次数:0
运行
复制
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.3.2.linux-x64.tar.gz 
tar -zxvf grafana-4.3.2.linux-x64.tar.gz
mv grafana-4.3.2 grafana
cd grafana/bin/
#查看可以安装的插件
./grafana-cli plugins list-remote
#安装zabbix插件
./grafana-cli plugins install alexanderzobnin-zabbix-app
#安装饼图插件
./grafana-cli plugins install grafana-piechart-panel
#启动,并后台运行
./grafana-server -homepath /opt/grafana/grafana &

温馨提示: 第一次登陆默认密码为admin/admin

WeiyiGeek.grafana登陆

资源清单方式:

代码语言:javascript
代码运行次数:0
运行
复制
mkdir /app/grafana && chown -R 472:0 /app/grafana
tee grafana.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
  namespace: default
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        supplementalGroups: 0
      containers:
        - name: grafana
          image: grafana/grafana:8.5.4
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /robots.txt
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 30
            successThreshold: 1
            timeoutSeconds: 2
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 3000
            timeoutSeconds: 1
          resources:
            requests:
              cpu: 250m
              memory: 750Mi
          volumeMounts:
          - mountPath: /var/lib/grafana
            name: grafana-pv
      volumes:
      - name: grafana-pv
        hostPath:
          path: /app/grafana
          type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: default
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: http-grafana
      nodePort: 30002
  selector:
    app: grafana
  sessionAffinity: None
  type: NodePort
EOF

kubectl apply -f grafana.yaml
kubectl get pod
  # NAME                      READY   STATUS    RESTARTS   AGE
  # grafana-f6799b947-rl47d   1/1     Running   0          45m

2.Ubuntu 20.04安装Grafana

1) 资源清单部署方式

步骤 01.资源清单(granana.ini)与 (Deployment)部署资源清单。

代码语言:javascript
代码运行次数:0
运行
复制
tee grafana.ini <<'EOF'
[server]
domain = devops.weiyigeek.top
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
serve_from_sub_path = true
EOF

tee grafana-deploy.yaml <<'EOF'
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc
  namespace: dashboard
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
  namespace: dashboard
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        supplementalGroups:
          - 0
      containers:
        - name: grafana
          image: grafana/grafana:9.0.2
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /robots.txt
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 30
            successThreshold: 1
            timeoutSeconds: 2
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 3000
            timeoutSeconds: 1
          resources:
            requests:
              cpu: 512m
              memory: 1024Mi
          volumeMounts:
            - mountPath: /var/lib/grafana
              name: grafana-pv
            - mountPath: /etc/grafana/grafana.ini
              name: ge-config
              subPath: grafana.ini
      volumes:
        - name: grafana-pv
          persistentVolumeClaim:
            claimName: grafana-pvc
        - name: ge-config
          configMap:
            name: ge-config
            items:
            - key: grafana.ini
              path: grafana.ini
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: dashboard
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: http-grafana
  selector:
    app: grafana
  sessionAffinity: None
  type: LoadBalancer
EOF

步骤 02.创建 grafana.ini 的 configmap 以及部署 grafana 到集群中

代码语言:javascript
代码运行次数:0
运行
复制
kubectl create configmap ge-config --from-file=grafana.ini --namespace dashboard
kubectl create -f grafana-deploy.yaml --namespace dashboard

步骤 03.部署情况与日志情况查看。

代码语言:javascript
代码运行次数:0
运行
复制
kubectl logs -f --tail 50 -n dashboard -l app=grafana
  # 关键日志:
  # logger=http.server t=2022-07-14T07:24:25.409774065Z level=info msg="HTTP Server Listen" address=[::]:3000 protocol=http subUrl=/grafana socket=

步骤 04.配置 grafana ingress 的资源清单我们便可通过域名+grafana目录的方式进行访问。

代码语言:javascript
代码运行次数:0
运行
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
    nginx.ingress.kubernetes.io/client-body-buffer-size: 50m
    nginx.ingress.kubernetes.io/proxy-body-size: 50m
    nginx.ingress.kubernetes.io/proxy-buffer-size: 50m
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: 60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: 120s
    nginx.ingress.kubernetes.io/proxy-send-timeout: 120s
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  labels:
    app: devops
    ref: devops
    url: devops.weiyigeek.top
  name: devops-weiyigeek
  namespace: dashboard
spec:
  ingressClassName: nginx
  rules:
  - host: devops.weiyigeek.top
    http:
      paths:
      - backend:
          service:
            name: grafana
            port:
              number: 3000
        path: /grafana(/|$)(.*)
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - devops.weiyigeek.top
    secretName: weiyigeek.top

温馨提示: 在进行前面操作完毕后我们便可通过https://devops.weiyigeek.top/grafana/login域名地址进行访问,默认密码 admin。

helm3 方式安装

代码语言:javascript
代码运行次数:0
运行
复制
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm search repo grafana
helm show values grafana/grafana --version 6.29.5 > granfa-values.yaml   # 指定chat版本的granfa相关部署参数
helm install grafana grafana/grafana --version 6.29.5 --set nodeSelector="kubernetes\.io/hostname=node-223",service.type=NodePort,persistence.enabled=True,persistence.storageClassName="managed-nfs-storage",persistence.size=5Gi,persistence.accessModes=ReadWriteOnce -n devops --debug  # 安装指定chat版本以及部署参数
helm upgrade grafana grafana/grafana --version 6.29.5 --set nodeSelector="kubernetes\.io/hostname=node-223",service.type=NodePort,persistence.enabled=True,persistence.storageClassName="managed-nfs-storage",persistence.size=5Gi,persistence.accessModes=ReadWriteOnce -n devops --debug  # 更新指定chat版本以及部署参数
helm list -n devops
  # NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
  # grafana devops          1               2022-06-01 13:53:51.751609203 +0800 CST deployed        grafana-6.29.5  8.5.3

执行结果:

代码语言:javascript
代码运行次数:0
运行
复制
NOTES:
1. Get your 'admin' user password by running:
  kubectl get secret --namespace devops grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo  
  # 例如: Y0GW80b6tsMhqO223zRfh0ONx2O8BovtYg3JAKHa

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster: grafana.devops.svc.cluster.local
  Get the Grafana URL to visit by running these commands in the same shell:
    export POD_NAME=$(kubectl get pods --namespace devops -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}")
    kubectl --namespace devops port-forward $POD_NAME --address 0.0.0.0 30002:3000
3. Login with the password from step 1 and the username: admin

0x02 Granafa 入门使用

1) 基础配置

1.1 添加数据源

描述: 例如此次添加一个Prometheus数据源到Grafana,注意最后一定要点击Save&Test来保证Grafana可以正常访问我们的Prometheus。

操作步骤: 侧边栏 -> Congiguration -> Data Sources

WeiyiGeek.添加数据源

WeiyiGeek.Prometheus监控数据源

2) 仪表盘模板与面板

2.1 模板变量

描述: 我们可以使用模板变量来切换到详细监控主机的相关信息,这个功能非常Nice也非常实用。

  • Step 1.创建一个新的仪表盘,点击 + > Create Dashboard -> Add an empty Panel -> 测试出现一个初始面板界面 -> 点击Setting(右上角的齿轮) 。
  • Step 2.进入后点击 Varibales -> 点击+add variable进行添加一个模板变量 -> 设置变量名称OSRELEASE -> Prometheus PromQL 为node_uname_info -> 正则表达式来获取标签中的内核版本 -> .*release="(.*?)".* -> 点击update,我们可以仿照添加一个节点名称的变量以及网卡名称node_network_receive_bytes_total -> .*device="(docker.*?|eno.*?|ens.*?)".*
  • Step 3.回到Panel首页可以看到OSRELEASE 与 NODENAME 模板变量的下拉列表->最后点击 Save Dashboard (保存面板)。

WeiyiGeek.模板变量

  • Step 4.使用模板变量,需要新建一个面板->输入rate(node_network_receive_bytes_total{device="$Device"}[5m]) -> Legend 设置为 Title 设置 Bytes/Received ,其中数据速率下的Unit 设置为bytes/sec,最后点击保存。

WeiyiGeek.使用模板变量

2.1 图形Panel

描述: 如其名称其主要用于显示图表。

  • Step 1.进入面板编辑器点Panel Title -> 点击 Edit (快捷键e) -> 在metrics中输入查询表达式node_memory_Active_bytes .
  • Step 2.配置自定义图例标题和轴单位的内存使用情况。

WeiyiGeek.简单图表

3.1 单一统计Panel

描述: 显示单个时间序列的值。

  • Step 1.点击图表添加图表 -> 添加单一统计Panel

3) 基础控件

3.1 时间控件

描述: 它可以选择时间范围和刷新频率,它适用于整个仪表盘但你也可以在每个Panel上覆盖配置。

Tips: 当图表刷新时即使基础数据没有改变,但你也会注意到形状可能发生变化,这个情况被称为混叠的信号处理效果。

0x03 进阶扩展配置

0.Email 告警配置

描述: 在 Grafana 中提供了多种告警方式,其中最常用的就是邮箱告警, 下面我们来简单实践在Grafana中实现邮件告警。

步骤 01.在 grafana 的主配置文件 grafana.ini 中开启 smtp 并配置相关参数(此处我采用了企业邮箱):

代码语言:javascript
代码运行次数:0
运行
复制
$ cat grafana.ini
....
[smtp]
  enabled = true
  host = smtp.exmail.qq.com:465
  user = monitor@weiyigeek.top
  password = weiyigeek.top
  from_address = monitor@weiyigeek.top
  from_name = Grafana
  ehlo_identity = devops.weiyigeek.top

步骤 02.修改 grafana.ini 后便可重启 grafana 登陆其Dashboard ,点左菜单栏中🔔 (Alerting) -> Contact points (联络人) -> 编辑 grafana-default-email 告警对象 -> 选择触发对象为email -> 输入测试邮箱 -> 测试发信

WeiyiGeek.测试Email发信

步骤 03.发信后你将会在其输入指定邮箱中,看到 Grafana 发送到你邮箱的告警信息。

WeiyiGeek.Email告警配置验证

1.LDAP 认证配置

在 grafana 的主配置文件 grafana.ini 中开启 LDAP 认证:

代码语言:javascript
代码运行次数:0
运行
复制
[auth.ldap]
enabled = true
config_file = /etc/grafana/ldap.toml
  • config_file指定grafana的ldap配置文件ldap.toml的具体位置 ldap.toml 配置文件的内容如下
代码语言:javascript
代码运行次数:0
运行
复制
[[servers]]
host = "127.0.0.1"
port = 389
use_ssl = false
start_tls = false
ssl_skip_verify = false

bind_dn = "cn=Manager,dc=frognew,dc=com"
bind_password = 'thepassword'
search_filter = "(cn=%s)"
search_base_dns = ["ou=People,dc=frognew,dc=com"]
group_search_base_dns = ["ou=Group,dc=frognew,dc=com"]
group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"

[servers.attributes]
name = "givenName"
surname = "sn"
username = "cn"
member_of = "cn"
email =  "email"


[[servers.group_mappings]]
group_dn = "grafana-admin"
org_role = "Admin"

[[servers.group_mappings]]
group_dn = "grafana-editor"
org_role = "Editor"

[[servers.group_mappings]]

group_dn = "grafana-viewer"
org_role = "Viewer"
  • hostport指定LDAP Server的地址和端口
  • 因为我们使用的OpenLDAP,是没有memberOf属性的POSIX schema,所以获取用户的Group信息时需要另外一个查询,通过group_search_base_dnsgroup_search_filter,同事需要设置member_of = "cn"
  • servers.group_mappings中指定LDAP中Group和Grafan中org_role的对应关系,注意这里需要和配置成LDAP中Group的cn,这里配置的是grafana-admingrafana-editorgrafana-viewer,这点和官方文档Grafana LDAP Authentication中给的例子是不一样的。

0x04 grafana-cli 命令

常用命令:

代码语言:javascript
代码运行次数:0
运行
复制
# 查看可以安装的插件
grafana-cli plugins list-remote
grafana-cli plugins install grafana-piechart-panel alexanderzobnin-zabbix-app #安装zabbix插件和饼图插件

0x0n 入坑&出坑

问题1: 采用 Docker 安装 Grafana 时报 mkdir: can’t create directory ‘/var/lib/grafana/plugins’: I/O error 错误

错误信息:

代码语言:javascript
代码运行次数:0
运行
复制
docker logs --tail grafana
  # grafana         | GF_PATHS_DATA='/var/lib/grafana' is not writable.
  # grafana         | You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migrate-to-v51-or-later
  # grafana         | mkdir: can't create directory '/var/lib/grafana/plugins': I/O error
  # grafana         | GF_PATHS_DATA='/var/lib/grafana' is not writable.

问题原因: 从以前的Docker容器版本迁移问题针对/var/lib/grafana目录权限有所变化,所以在我们持久化该目录时应设置对应的uid、gid。

解决办法: https://grafana.com/docs/grafana/latest/installation/docker/#migrate-to-v51-or-later

代码语言:javascript
代码运行次数:0
运行
复制
# 用户ID更改与Grafana版本对应
Version 	User 	User ID 	Group 	Group ID
< 5.1 	grafana 	104 	grafana 	107
>= 5.1 	grafana 	472 	grafana 	472
>= 7.3 	grafana 	472 	root 	0

解决流程

代码语言:javascript
代码运行次数:0
运行
复制
# 1.映射的持久化目录的权限
chown -R 472:0 /data/grafana
# 2.以其他用户身份运行Docker
docker run --user 472 --volume "/data/grafana:/var/lib/grafana" grafana/grafana

问题2.使用Kubernetes集群搭建Grafana其POD会不停的重启错误.

错误信息:

代码语言:javascript
代码运行次数:0
运行
复制
$ kubectl get pod -n devops
  NAME                       READY   STATUS    RESTARTS      AGE
  grafana-6fb4d77ddc-s7xl5   0/1     Running   4 (18s ago)   11m

# 不断执行 Starting DB migrations 
$ kubectl logs -f --tail 50 -n devops grafana-6fb4d77ddc-s7xl5
  logger=migrator t=2022-06-01T03:11:30.93+0000 lvl=info msg="Starting DB migrations"
  logger=migrator t=2022-06-01T03:11:35.85+0000 lvl=info msg="Executing migration" id="delete stars for deleted dashboards"
  logger=migrator t=2022-06-01T03:11:42+0000 lvl=info msg="Executing migration" id="Add index for dashboard_is_folder"
  logger=migrator t=2022-06-01T03:11:46.9+0000 lvl=info msg="Executing migration" id="create data_source table"
  logger=migrator t=2022-06-01T03:11:52.87+0000 lvl=info msg="Executing migration" id="add index data_source.account_id"
  logger=migrator t=2022-06-01T03:11:58.46+0000 lvl=info msg="Executing migration" id="add unique index data_source.account_id_name"

问题可能原因:

1.提高限制内存减少触发OOM, 即 resource 字段设置resources: {}。 2.持久化数据persistence卷性能问题导致写过慢。

问题3.使用Docker搭建Grafana其POD会不停的重启错误.

问题错误: 在 docker 运行 grafana:7.0.3 版本时,grafana不断重启日志如下

代码语言:javascript
代码运行次数:0
运行
复制
$ docker run -d -p 3000:3000 -e TZ="Asia/Shanghai" --link=prometheus -v /data/grafana:/var/lib/grafana -v /data/grafana.ini:/etc/grafana/grafana.ini --name=grafana grafana/grafana:7.0.3

$ docker logs -f --tail 50 grafana
t=2020-06-04T11:26:22+0800 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=
t=2020-06-04T11:27:02+0800 lvl=info msg="Shutdown started" logger=server reason="System signal: terminated"
t=2020-06-04T11:27:02+0800 lvl=info msg="Stopped Stream Manager"

解决办法: 尝试docker修改各种命令启动后发现,当命令中 –name=grafana 时才会出现此问题,修改成其他name即可正常启动

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 前言简述
    • 1) Grafana 介绍
    • 2) Grafana 专有术语介绍
    • 3) Grafana 学习参考
  • 0x01 安装部署
    • 1.CentOS7安装Grafana
    • 2.Ubuntu 20.04安装Grafana
  • 0x02 Granafa 入门使用
    • 1) 基础配置
      • 1.1 添加数据源
    • 2) 仪表盘模板与面板
      • 2.1 模板变量
      • 2.1 图形Panel
      • 3.1 单一统计Panel
    • 3) 基础控件
      • 3.1 时间控件
  • 0x03 进阶扩展配置
    • 0.Email 告警配置
    • 1.LDAP 认证配置
  • 0x04 grafana-cli 命令
  • 0x0n 入坑&出坑
    • 问题1: 采用 Docker 安装 Grafana 时报 mkdir: can’t create directory ‘/var/lib/grafana/plugins’: I/O error 错误
    • 问题2.使用Kubernetes集群搭建Grafana其POD会不停的重启错误.
    • 问题3.使用Docker搭建Grafana其POD会不停的重启错误.
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档