博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阿里云容器Kubernetes监控(八) - 使用Prometheus实现应用自定义监控
阅读量:6329 次
发布时间:2019-06-22

本文共 5393 字,大约阅读时间需要 17 分钟。

前言

在上一篇文章中为大家讲解了如何在Kubernetes集群中部署Prometheus,已经可以通过Prometheus监控Kubernetes中Pod的状态、核心组件的状态等数据。那么如何将应用自身的数据进行集成呢?

Prometheus数据格式解析

Prometheus是通过pull模式进行数据采集的,如果需要接入Prometheus的数据采集,需要符合Prometheus的数据格式,一个标准的Prometheus格式的监控数据格式如下:

# TYPE rpc_durations_seconds summaryrpc_durations_seconds{service="exponential",quantile="0.5"} 7.55823964126038e-07rpc_durations_seconds{service="exponential",quantile="0.9"} 2.6110063096397233e-06rpc_durations_seconds{service="exponential",quantile="0.99"} 4.1856147763703275e-06rpc_durations_seconds_sum{service="exponential"} 0.00020646687333031658rpc_durations_seconds_count{service="exponential"} 199rpc_durations_seconds{service="normal",quantile="0.5"} -9.691909897213225e-07rpc_durations_seconds{service="normal",quantile="0.9"} 0.00025830474325216625rpc_durations_seconds{service="normal",quantile="0.99"} 0.0005562243742048893rpc_durations_seconds_sum{service="normal"} -6.545190575669169e-05rpc_durations_seconds_count{service="normal"} 134rpc_durations_seconds{service="uniform",quantile="0.5"} 9.377796898048464e-05rpc_durations_seconds{service="uniform",quantile="0.9"} 0.00018267981258729418rpc_durations_seconds{service="uniform",quantile="0.99"} 0.0001955526954715437rpc_durations_seconds_sum{service="uniform"} 0.009804051013554931rpc_durations_seconds_count{service="uniform"} 101

表面上这个数据的格式是非常简单的,但实际上,如果我们手动去尝试拼接这样的数据格式,可能会由于特殊字符、命名方式、字符串长度等等不同原因导致Prometheus无法识别。此处我们建议直接使用Prometheus的Client进行注册监控接口。Promehtues的Client目前支持大部分编程语言,支持列表可以参考如下。下面我们以Go语言为例,来看下Prometheus Client的用法:

var (    // Create a summary to track fictional interservice RPC latencies for three    // distinct services with different latency distributions. These services are    // differentiated via a "service" label.    rpcDurations = prometheus.NewSummaryVec(        prometheus.SummaryOpts{            Name:       "rpc_durations_seconds",            Help:       "RPC latency distributions.",            Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},        },        []string{"service"},    ))func init() {    // Register the summary and the histogram with Prometheus's default registry.    prometheus.MustRegister(rpcDurations)}func main() {    flag.Parse()    start := time.Now()    oscillationFactor := func() float64 {        return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(*oscillationPeriod)))    }    // Periodically record some sample latencies for the three services.    go func() {        for {            v := rand.Float64() * *uniformDomain            rpcDurations.WithLabelValues("uniform").Observe(v)            time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond)        }    }()    go func() {        for {            v := (rand.NormFloat64() * *normDomain) + *normMean            rpcDurations.WithLabelValues("normal").Observe(v)            time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond)        }    }()    go func() {        for {            v := rand.ExpFloat64() / 1e6            rpcDurations.WithLabelValues("exponential").Observe(v)            time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond)        }    }()    // Expose the registered metrics via HTTP.    http.Handle("/metrics", promhttp.Handler())    log.Fatal(http.ListenAndServe(*addr, nil))}

在本例子中,我们注册了一个名叫rpc_durations_seconds的指标,首先需要prometheus.MustRegister注册一个监控指标,在本例中rpc_durations_secondsprometheus.NewSummaryVec类型的,其他类型可以参考。rpcDurations是一个全局的单例,可以在期望更新监控数据的时候可以调用rpcDurations.WithLabelValues("uniform").Observe(v)来增加监控数据即可。代码模板可以参考如下

集成Promehtues系统进行应用监控

1.我们将上文中打包好的应用镜像,并下发Deployment与Service到集群中。

apiVersion: apps/v1beta1kind: Deploymentmetadata:  name: demo-app  labels:    app: demo-appspec:  replicas: 2  selector:    matchLabels:      app: demo-app  template:    metadata:      labels:        app: demo-app    spec:      containers:      - name: demo-app        image: registry.cn-hangzhou.aliyuncs.com/ringtail/prometheus-demo:v1        command:        - /random         ports:        - containerPort: 8080---apiVersion: v1kind: Servicemetadata:  labels:    app: demo-app  name: demo-app  namespace: defaultspec:  ports:  - name: http-metrics    port: 8080    protocol: TCP    targetPort: 8080  selector:    app: demo-app  type: ClusterIP

2.部署当前应用的serviceMonitor到集群

apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:  labels:    app: demo-app  name: demo-app  namespace: monitoringspec:  endpoints:  - interval: 30s    port: http-metrics  jobLabel: app  namespaceSelector:    matchNames:    - default  selector:    matchLabels:      app: demo-app

此处需要特别做些解释,serviceMonitor是Prometheus Operator中抽象的概念,他的作用就是讲配置Prometheus采集Target的配置变化成为动态发现的方式,可以serviceMonitor通过Deployment对应的Service配置进行挂钩,通过label selector选择Service,并自动发现后端容器。其中需要注意的是namespace字段永远为monitoring,而namespaceSelector中则是选择的应用所在的namespace。

3.访问Prometheus,验证数据采集,打开Status下的Service Discovery,active的数目等于Pod数据即表示采集正常。

# 本地Proxy到Prometheuskubectl --namespace monitoring port-forward svc/prometheus-k8s 9090

image

打开Graph页面,选择我们刚才推送的数据指标名称,点击Execute,即可查看到采集上来的数据。

image

4.配置Grafana页面,点击New Dashboard,创建新的Dashboard,展现监控数据

# 本地Proxy到Grafanakubectl --namespace monitoring port-forward svc/grafana 3000

image

在本例子中,我们配置了计算rpc_durations_seconds和值的语法,在Prometheus中还有非常多复杂的聚合方式,建议大家参考已有的一些Dashboard或者翻阅PromSQL的。

最后

使用Prometheus接入应用监控的方式非常简单,整个操作的流程非常kubernetes,这也是目前非常多的开源软件和Kubernetes集成的一种方式与趋势,在开发者习惯了之后,会越来越感受到这种方式的便利。更多的operator可以参考这个

转载地址:http://ytwoa.baihongyu.com/

你可能感兴趣的文章
爪哇国新游记之十二----线程创建的两种形式
查看>>
64. Minimum Path Sum
查看>>
Windows Live Writer 使用指南
查看>>
分析iOS Crash文件,使用命令符号化iOS Crash文件
查看>>
mesos
查看>>
Java动态代理学习【Spring AOP基础之一】
查看>>
Android之读取 AndroidManifest.xml 中的数据:版本号、应用名称、自定义K-V数据(meta-data)...
查看>>
R学习笔记 第五篇:字符串操作
查看>>
在Mac OS下配置PHP开发环境
查看>>
(转)介绍下Nuget在传统Asp.net项目中的使用
查看>>
C# ArcEngine 实现点击要素高亮并弹出其属性
查看>>
初识GO语言——安装Go语言
查看>>
SDK命令行操作
查看>>
基于Bootstrap的DropDownList的JQuery组件的完善版
查看>>
EXTJS学习系列提高篇:第二十四篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--阅增删改篇...
查看>>
Hadoop MapReduce编程 API入门系列之分区和合并(十四)
查看>>
判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
查看>>
并查集的应用之求解无向图中的连接分量个数
查看>>
7个神奇的jQuery 3D插件
查看>>
在线浏览PDF之PDF.JS (附demo)
查看>>