为什么选择Prometheus?

随着深入地了解Prometheus,你会发现一些非常好的功能:
•服务发现使配置更加容易。Prometheus支持consul,etcd,kubernetes以及各家公有云厂商自动发现。对于监控目标动态发现,这点特别契合Cloud时代,应用动态扩缩的特点。我们无法想象,在Cloud时代,需要运维不断更改配置。
•开源社区建立了数百个exporter。基本上涵盖了所有基础设施和主流中间件。
•工具库可从您的应用程序获取自定义指标。基本上主流开发语言都有对应的工具库。
•它是CNCF旗下的OSS,是继Kubernetes之后的第二个毕业项目。Kubernetes已经与Promethues深度结合,并在其所有服务中公开了Prometheus指标。
•Pushgateway,Alermanager等组件,基本上涵盖了一个完整的监控生命周期。
•Flink官方已经提供了对接Prometheus的jar包,很方便就可以集成。由于本系列文章重点在Flink on Kubernetes, 因此我们所有的操作都是基于这点展开。

部署Prometheus

对k8s不熟悉的同学,可以查阅k8s相关文档。由于部署不是本博客的重点,所以我们直接贴出yaml文件:

---apiVersion: v1kind: ServiceAccountmetadata:name: monitornamespace: kube-systemlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcile
---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: monitorlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcile rules:- apiGroups:- ""resources:- podsverbs:- get- list- watch
---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: monitorlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: ReconcileroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: monitorsubjects:- kind: ServiceAccountname: monitornamespace: kube-system
---apiVersion: v1kind: ConfigMapmetadata:labels:app: monitorname: monitornamespace: kube-systemdata:prometheus.yml: |-global:scrape_interval:     10sevaluation_interval: 10sscrape_configs:- job_name: kubernetes-podskubernetes_sd_configs:- role: podrelabel_configs:- action: keepregex: truesource_labels:- __meta_kubernetes_pod_annotation_prometheus_io_scrape- action: replaceregex: (.+)source_labels:- __meta_kubernetes_pod_annotation_prometheus_io_pathtarget_label: __metrics_path__- action: replaceregex: ([^:]+)(?::\d+)?;(\d+)replacement: $1:$2source_labels:- __address__- __meta_kubernetes_pod_annotation_prometheus_io_porttarget_label: __address__- action: labelmapregex: __meta_kubernetes_pod_label_(.+)- action: replacesource_labels:- __meta_kubernetes_namespacetarget_label: kubernetes_namespace- action: replacesource_labels:- __meta_kubernetes_pod_nametarget_label: kubernetes_pod_name
---apiVersion: apps/v1kind: StatefulSetmetadata:labels:app: monitorname: monitornamespace: kube-systemspec:serviceName: monitorselector:matchLabels:app: monitorreplicas: 1template:metadata:labels:app: monitorspec:containers:- args:- --config.file=/etc/prometheus/prometheus.yml- --storage.tsdb.path=/data/prometheus- --storage.tsdb.retention.time=10d image: prom/prometheus:v2.19.0imagePullPolicy: IfNotPresentname: prometheusports:- containerPort: 9090protocol: TCPreadinessProbe:httpGet:path: /-/readyport: 9090initialDelaySeconds: 30timeoutSeconds: 30livenessProbe:httpGet:path: /-/healthyport: 9090initialDelaySeconds: 30timeoutSeconds: 30resources:limits:cpu: 1000mmemory: 2018Mirequests:cpu: 1000mmemory: 2018MivolumeMounts:- mountPath: /etc/prometheusname: config-volume- mountPath: /dataname: monitor-persistent-storagerestartPolicy: AlwayspriorityClassName: system-cluster-criticalserviceAccountName: monitorinitContainers:- name: "init-chown-data"image: "busybox:latest"imagePullPolicy: "IfNotPresent"command: ["chown", "-R", "65534:65534", "/data"]volumeMounts:- name: monitor-persistent-storagemountPath: /datasubPath: ""volumes:- configMap:defaultMode: 420name: monitorname: config-volumevolumeClaimTemplates:- metadata:name: monitor-persistent-storagenamespace: kube-systemspec:accessModes:- ReadWriteOnceresources:requests:storage: 20GistorageClassName: gp2
---apiVersion: v1kind: Servicemetadata:annotations:service.beta.kubernetes.io/aws-load-balancer-type: nlblabels:app: monitorname: monitornamespace: kube-systemspec:ports:- name: httpport: 9090protocol: TCPtargetPort: 9090selector:app: monitortype: LoadBalancer

这里我们简单说下,由于我们想利用Prometheus的Kubernetes的服务发现的方式,所以需要RBAC授权,授权prometheus 实例对集群中的pod有一些读取权限。

为什么我们要使用自动发现的方式那?

相比配置文件的方式,自动发现更加灵活。尤其是当你使用的是flink on native kubernetes,整个job manager 和task manager 是根据作业的提交自动创建的,这种动态性,显然是配置文件无法满足的。

由于我们的集群在eks上,所以大家在使用其他云的时候,需要略做调整。

定制镜像

这里我们基本上使用上一篇文章介绍的demo上,增加监控相关,所以Dockerfile如下:

FROM flink
COPY /plugins/metrics-prometheus/flink-metrics-prometheus-1.11.0.jar /opt/flink/lib
RUN mkdir -p $FLINK_HOME/usrlib
COPY ./examples/streaming/WordCount.jar $FLINK_HOME/usrlib/my-flink-job.jar

Flink 的 Classpath 位于/opt/flink/lib,所以插件的jar包需要放到该目录下。

作业提交

由于我们的Pod必须增加一定的标识,从而让Prometheus实例可以发现。所以提交命令稍作更改,如下:

./bin/flink run-application -p 8 -t kubernetes-application \-Dkubernetes.cluster-id=my-first-cluster \-Dtaskmanager.memory.process.size=2048m \-Dkubernetes.taskmanager.cpu=2 \-Dtaskmanager.numberOfTaskSlots=4 \-Dkubernetes.container.image=iyacontrol/flink-world-count:v0.0.2 \-Dkubernetes.container.image.pull-policy=Always \-Dkubernetes.namespace=stream \-Dkubernetes.jobmanager.service-account=flink \-Dkubernetes.rest-service.exposed.type=LoadBalancer \-Dkubernetes.rest-service.annotations=service.beta.kubernetes.io/aws-load-balancer-type:nlb,service.beta.kubernetes.io/aws-load-balancer-internal:true \-Dkubernetes.jobmanager.annotations=prometheus.io/scrape:true,prometheus.io/port:9249 \-Dkubernetes.taskmanager.annotations=prometheus.io/scrape:true,prometheus.io/port:9249 \-Dmetrics.reporters=prom \-Dmetrics.reporter.prom.class=org.apache.flink.metrics.prometheus.PrometheusReporter \local:///opt/flink/usrlib/my-flink-job.jar

•给 jobmanager 和 taskmanager 增加了annotations
•增加了metrcis相关的配置,指定使用prometheus reporter

关于prometheus reporter:

参数:

•port - 可选, Prometheus导出器监听的端口,默认为9249。为了能够在一台主机上运行报告程序的多个实例(例如,当一个TaskManager与JobManager并置时),建议使用这样的端口范围 9250-9260。
•filterLabelValueCharacters - 可选, 指定是否过滤标签值字符。如果启用,则将删除所有不匹配[a-zA-Z0-9:_]的字符,否则将不删除任何字符。禁用此选项之前,请确保您的标签值符合Prometheus要求。
效果

提交任务后,我们看下实际效果。

首先查看Prometheus 是否发现了我们的Pod。

然后查看具体的metrics,是否被准确抓取。

指标已经收集,后续大家就可以选择grafana绘图了。或是增加相应的报警规则。例如:

总结

当然除了Prometheus主动发现Pod,然后定期抓取metrcis的方式,flink 也支持向PushGateway 主动push metrcis。

Flink 通过 Reporter 来向外部系统提供metrcis。通过在conf/flink-conf.yaml中配置一个或多个Reporter ,可以将metrcis公开给外部系统。这些Reporter在启动时将在每个作业和任务管理器上实例化。

所有Reporter都必须至少具有class或factory.class属性。可以/应该使用哪个属性取决于Reporter的实现。有关更多信息,请参见各个Reporter 配置部分。一些Reporter允许指定报告间隔。

指定多个Reporter 的示例配置:

metrics.reporters: my_jmx_reporter,my_other_reporter
metrics.reporter.my_jmx_reporter.factory.class: org.apache.flink.metrics.jmx.JMXReporterFactory
metrics.reporter.my_jmx_reporter.port: 9020-9040
metrics.reporter.my_jmx_reporter.scope.variables.excludes:job_id;task_attempt_num
metrics.reporter.my_other_reporter.class: org.apache.flink.metrics.graphite.GraphiteReporter
metrics.reporter.my_other_reporter.host: 192.168.1.1
metrics.reporter.my_other_reporter.port: 10000

启动Flink时,必须可以访问包含reporter的jar。支持factory.class属性的reporter可以作为插件加载。否则,必须将jar放在/lib文件夹中。

你可以通过实现org.apache.flink.metrics.reporter.MetricReporter接口来编写自己的Reporter。

如果 reporter定期发送报告,则还必须实现Scheduled接口。通过额外实现MetricReporterFactory,你的reporter也可以作为插件加载。

原文链接:https://segmentfault.com/a/1190000023392377

参考链接 :
使用Prometheus监控Flink :https://mp.weixin.qq.com/s/Oh3r8-hAGo9npcy-7TiuwA

使用Prometheus监控Flink相关推荐

  1. 大数据监控平台-Prometheus监控Hadoop3.1.3

    简介 本篇主要是使用jmx配合Prometheus监控大数据平台 前提 链接:https://pan.baidu.com/s/1c6nsjOKw4-a_Wqr82l0QhQ  提取码:yyds  -- ...

  2. SpringBoot使用prometheus监控

    本文介绍SpringBoot如何使用Prometheus配合Grafana监控. 1.关于Prometheus Prometheus是一个根据应用的metrics来进行监控的开源工具.相信很多工程都在 ...

  3. Prometheus监控的最佳实践——关于监控的3项关键指标

    本文来自Weaveworks的工程师Anita Burhrle在Rancher Labs与Weaveworks联合举办的Online Meetup上的技术分享.在此次分享中,嘉宾们讨论了如何使用Ran ...

  4. 基于 eBPF 的 prometheus 监控方案

    基于 eBPF 的 prometheus 监控方案 1. 前言 2. ebpf_exporter 环境搭建 3. Prometheus 与 Grafana 配置 4. ebpf_exporter 代码 ...

  5. prometheus监控_使用Prometheus和Grafana监视开放自由

    prometheus监控 我录制了一个视频,该视频如何通过简单地配置服务器功能,使用Prometheus和Grafana向Open Liberty实例添加监视. 如果我们仅添加监视功能( monito ...

  6. 使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库

    使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库 原文:使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库 一.背 ...

  7. 阿里云容器Kubernetes监控(七) - Prometheus监控方案部署

    前言 Prometheus是一款面向云原生应用程序的开源监控工具,作为第一个从CNCF毕业的监控工具而言,开发者对于Prometheus寄予了巨大的希望.在Kubernetes社区中,很多人认为Pro ...

  8. 从零搭建Prometheus监控报警系统

    从零开始搭建Prometheus自动监控报警系统 从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据 ...

  9. 监控工具—Prometheus—监控Redis

    原文作者:wyl9527 原文地址:Grafana Prometheus系统监控Redis服务 目录 1.下载redis_exporter安装包 2.解压安装 3.systemd管理redis_exp ...

最新文章

  1. SpringBoot 启动错误搜集
  2. spoj2 Prime Generator
  3. [转载]windows内存优化 没你想像那么美
  4. 单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...
  5. 阿里云实时计算,前世功,今生能!
  6. notepad去除每行空格后面的所有的内容,并且获取每行最后一个字段的内容(就是删除每行的行首空格)...
  7. python3九九乘法表儿歌下载_python3的基础学习之九九乘法表和format函数,值得收藏...
  8. mysql设置utf8_unicode_ci字符集php页面输出??乱码的解决方法
  9. ajax---post跨域思路
  10. better-scroll插件 api
  11. Django组件 中间件
  12. Picasa是什么软件
  13. [TF进阶] 循环神经网络
  14. 局域网访问mysql失败_局域网中mysql连接失败
  15. linux 目录 特殊符号,Linux常见特殊符号
  16. 100G多模光模块介绍及应用
  17. 怎么通过Unity和谷歌纸盒做一个VR游戏?(译)
  18. 青青子佩(朋友写给我的)
  19. MySQL学习之MySQL引擎
  20. APP二维码微信扫描后无法下载 微信中无法下载APP的解决方案

热门文章

  1. 网易如何做新闻推荐:深度学习排序系统及模型
  2. GBDT、随机森林、xgboost算法原理解析视频公开
  3. 吴恩达老师的机器学习和深度学习课程笔记打印版(全)
  4. ajax 请求struts1,jquery ajax +struts1.3
  5. 本地时间转utc时间_有关机器时间、UTC时间、本地时间的总结
  6. 11gR2conceptes Memory Architecture中文翻译
  7. Android: 在WebView中获取网页源码
  8. html input触发器类型,几种触发器的Verliog语言描述
  9. 一起来看React(路由跳转)
  10. OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功