django后端服务、logstash和flink接入VictoriaMetrics指标监控
# 0.简介
通过指标监控可以设置对应的告警,快速发现问题,并通过相应的指标定位问题。
背景:使用的 VictoriaMetrics(简称 VM) 作为监控的解决方案,需要将 django 服务、logstash 和 flink 引擎接入进来,VM 可以实时的获取它们的指标存储并进行监控告警,以上的服务都是部署在 k8s 中的。
# 1.VictoriaMetrics
VictoriaMetrics,是一个快速高效、经济并且可扩展的监控解决方案和时序数据库。比较出名的监控方案有 Promethues,而 VM 是兼容 Promethues 的各种规范、配置等,可以快速的融入 Promethues 生态甚至是取代它。
VM 获取服务指标的方式也是通过主动拉取的方式,每个服务都会暴露一个端口供 VM 来拉取服务的指标信息
# 2.django 服务接入
可以通过使用第三方库 prometheus-client (opens new window) 来收集服务的指标信息,并暴露端口给 VM 拉取。
- 安装
pip install prometheus-client
- 使用
因为该服务使用的是 wsgi 协议的,所以在 wsgi.py 文件中添加以下代码,会开启一个新的线程监听 9300 端口,请求该端口可以获取当前服务的参数指标。
from prometheus_client import start_wsgi_server
start_wsgi_server(9300)
2
如果想要上报业务指标,可以通过该库在业务中进行埋点和收集。
还需要在 pod 中添加 ports 属性提供给 VM 使用,这个在后面讲解。
- containerPort: 9300
name: exportport
protocol: TCP
2
3
# 3.logstash 接入
logstash 是有自己的指标监控服务,需要在配置文件 logstash.yaml 中将其端口暴露。
http.port: 9600
但是其指标格式和 prometheus 的指标格式是不同的,所以需要通过另一个程序 exporter 来将 logstash 指标转换成 prometheus 指标格式。
该 logstash 是部署在 k8s 中的,使用到容器设计模式 sidecar,就是在 pod 中新增一个容器来辅助主容器 logstash 来做监控指标的转换并提供给 VM 调用。
logstash 的 exporter 可以使用 prometheus-logstash-exporter (opens new window) 来完成,可以去 docker hub 中找到对应的镜像,并将其下载下来使用。
在 logstash 的 pod 中添加以下配置来设置 exporter,将暴露 9300 端口作为 logstash 的指标监控端口给 VM 拉取。这里需要配置 ports,在 VM 中需要使用该参数。
- name: logstash-exporter
image: alxrem/prometheus-logstash-exporter:0.7.0
args:
- -logstash.host
- 127.0.0.1
- -logstash.port
- 9600
- -web.listen-address
- 9300
ports:
- name: exportport
containerPort: 9300
2
3
4
5
6
7
8
9
10
11
12
# 4.flink 接入监控
flink 本身是支持 prometheus 的指标监控,只需要通过添加配置 flink 的参数即可开启。
metrics.reporters: prom
metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
metrics.reporter.prom.port: "9300"
2
3
除了上面的配置外,还需要在 Pod 中设置 ports 来供 VM 使用。
ports:
- name: exportport
containerPort: 9300
2
3
# 5.VMPodScrape
虽然上面的服务都暴露了指标端口,VM 如何找到它们呢?需要通过创建 VMPodScrape 的资源对象来帮助 VM 来找到它们。
配置如下:
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
labels:
prometheus: k8s
name: demo-pod-monitor
namespace: monitor
spec:
namespaceSelector:
any: true
podMetricsEndpoints:
- path: /metrics
port: exportport
selector:
matchLabels:
app: django
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- spec.podMetricsEndpoints.port,这个就是在每个 pod 中添加的 ports 中对应的 name,VM 会去找到对应 name 的端口获取指标
- spec.selector.matchLabels,通过标签过滤找到指定的 pod
通过 kubectl apply -f
创建该资源对象,VM 就能找到指标提供的服务。