热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

prometheus监控_使用Prometheus监控Flink

这篇文章介绍了如何利用ApacheFlink的内置指标系统以及如何使用Prometheus来高效地监控流式应用程序。为什么选择Prometheus?随着深入地了解Pr

这篇文章介绍了如何利用Apache Flink的内置指标系统以及如何使用Prometheus来高效地监控流式应用程序。

620e0eb518c8eb5f3ae9dcdd4f39ebac.png

为什么选择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。

597be8ed1b709c122e8131a1c48636f9.png

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

bb008c5ab7376900cdf05cef5bd76795.png

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

d502920dc8175affc7606614b07b3808.png

总结

当然除了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_reportermetrics.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_nummetrics.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也可以作为插件加载。



推荐阅读
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • Storm集成Kakfa
    一、整合说明Storm官方对Kafka的整合分为两个版本,官方说明文档分别如下:StormKafkaIntegratio ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解
    目录一、代码背景二、主要工具三、函数解析1、FindWindow:2、FindWindowEx:3、SendMessage: ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 在拉斯维加斯举行的Interop 2011大会上,Bitcurrent的Alistair Croll发表了一场主题为“如何以云计算的视角进行思考”的演讲。该演讲深入探讨了传统IT思维与云计算思维之间的差异,并提出了在云计算环境下应具备的新思维方式。Croll强调了灵活性、可扩展性和成本效益等关键要素,以及如何通过这些要素来优化企业IT架构和运营。 ... [详细]
  • prometheus09-k8s部署grafana
    1.部署grafana?apiVersion:?appsv1?kind:?StatefulSet?metadata:??name:?grafana??namespace:?kube-systemspec:??serviceName:?grafana??repl ... [详细]
  • Kubernetes_如何在GO语言中使用Kubernetes API?
    本文由编程笔记#小编为大家整理,主要介绍了如何在GO语言中使用KubernetesAPI?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Kubernetes 1.2 新功能解析:multizone(多区)支持
    导论Kubernetes1.2增加的一个新的功能是把一个集群跑在多个failurezone里(谷歌GCE管它叫“zone”,亚马逊AWS管它们叫“ava ... [详细]
  • 原文:https:www.cnblogs.comdalianpaip12088118.htmlapiVersion:appsv1kind:DaemonSetme ... [详细]
  • 工作原理_一文理解 Spark 基础概念及工作原理
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了一文理解Spark基础概念及工作原理相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
喜怒哀乐168_572
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有