上一篇文章Probius+Kubernetes任务系统如虎添翼讲了我们把Kubernetes集成进了任务系统Probius,上线后小伙伴反馈虽然摆脱了Kubernetes-Dashboard,但还是得去Grafana系统查看容器的监控数据,能否将容器监控也给集成进Probius呢?只要能优化流程提高效率那就必须给安排

当前Kubernetes集群通过Prometheus来收集和存储监控数据同时借助Grafana来画图展示,Probius若想集成容器监控只需要获取Prometheus存储的容器数据并绘图展示即可,这里涉及到两块内容:1. 获取Prometheus中存储的POD数据,2. 根据获取到的POD数据进行画图展示,完成后的效果如下

获取数据

Prometheus提供queryquery_range两个API来获取数据,query可以查询给定时间点的数据,而query_range支持查询给定时间段内的数据集合,对于我们的需求query_range再合适不过了

GET /api/v1/query_range

API支持以下几个参数:

query:Prometheus查询表达式,string类型

start:开始时间,rfc3339或是unix_timestamp格式

end:结束时间,rfc3339或是unix_timestamp格式

step:步长,可以是15s这样的持续时间格式

timeout:超时时间

根据这些信息就可以编写获取数据的程序了,大概如下

class PrometheusApi:
def __init__(self, range=1):
self.domain = "https://prometheus.ops-coffee.cn" self.nowtime = datetime.datetime.now(datetime.timezone.utc)
self.start_time = self.nowtime - datetime.timedelta(hours=int(range)) def get_pod_metric(self, namespace, pod):
_data = {"datetime": [], "cpu": {}, "memory": {}, "bandwidth": {}, "iops": {}} # cpu
params = {
"query": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace='%s', pod='%s'}) by (container)" % (
namespace, pod),
"start": self.start_time.isoformat(),
"end": self.nowtime.isoformat(),
"step": "60s"
}
rc = requests.get(self.domain + '/api/v1/query_range', params=params) for c in rc.json().get('data').get('result'):
_data['cpu'][c['metric']['container']] = [j[1] for j in c['values']] return True, 200, _data

这里如果对Prometheus的查询表达式不熟悉,可以直接去Grafana图形那复制表达式来使用,这里我把cpu\memory等需要展示的数据统一在一个函数里处理了,这样只需要根据namesapce、pod和时间范围就能获取到一个pod的所有监控数据,方便前端展示

需要注意的是Prometheus默认使用的是UTC时间,所以在做时间处理时需要跟本地时间做转换

画图展示

数据获取到了,下一步就是画图展示,这里采用了echarts,使用也非常简单,大概代码如下

<div class="tab-pane" id="tab-monitor">
<div class="row">
<div class="col-md-4">
<div class="input-group">
<div class="input-group-btn"><button class="btn btn-default">选择实例</button></div>
<select class="form-control" id="id_pod_monitor" onchange="getPodMonitor()">
<option value="">------</option>
</select>
</div>
</div> <div class="col-md-2">
<div class="input-group">
<div class="input-group-btn"><button class="btn btn-default">时间范围</button></div>
<select class="form-control" id="id_pod_monitor_time" onchange="getPodMonitor()">
<option value="1" selected="selected">最近1小时</option>
<option value="4">最近4小时</option>
<option value="24">最近24小时</option>
<option value="48">最近48小时</option>
<option value="72">最近72小时</option>
</select>
</div>
</div>
<div class="col-md-6">
<div class="pull-right">
<button class="btn btn-default" onclick="getPodMonitor()">
<span class="glyphicon glyphicon-refresh"></span> 刷新
</button>
</div>
</div>
</div> <div class="row" style="margin-top:10px;">
<div class="col-md-6" id="id_chart_cpu" style="position: relative; height: 300px;"></div>
<div class="col-md-6" id="id_chart_memory" style="position: relative; height: 300px;"></div>
<div class="col-md-6" id="id_chart_bandwidth" style="position: relative; height: 300px;"></div>
<div class="col-md-6" id="id_chart_iops" style="position: relative; height: 300px;"></div>
</div>
</div> <script>
var chart_cpu = echarts.init(document.getElementById('id_chart_cpu')),
chart_memory = echarts.init(document.getElementById('id_chart_memory')),
chart_bandwidth = echarts.init(document.getElementById('id_chart_bandwidth')),
chart_iops = echarts.init(document.getElementById('id_chart_iops')); function getPodMonitor() {
var pod = $('#id_pod_monitor').val(), range = $('#id_pod_monitor_time').val();
$.get("/kubeops/namespace/{{ namespace }}/pod/" + pod + "/monitor/?range="+ range +"&format=json", function(data) {
if (data.state) {
let cpu_legend = new Array, cpu_series = new Array;
$.each(data.data.cpu, function (k, v) {
cpu_legend.push(k);
cpu_series.push({
data: v,
name: k,
type: 'line'
});
}) chart_cpu.setOption(
{
title: {text: 'CPU使用(单位:core)'},
tooltip: {trigger: 'axis'},
legend: {data:cpu_legend},
xAxis: {data: data.data.datetime},
yAxis: {type: 'value'},
series: cpu_series
}
)
}
})
}
</script>

echarts使用了最简单的折线图,也没有太多花里胡哨的东西,就是去后端取数据然后展示

至此搞定Probius集成POD监控,虽然这只是一个小功能但却是很有用~

Probius+Prometheus通过API集成POD监控的更多相关文章

  1. 简单4步,利用Prometheus Operator实现自定义指标监控

    本文来自Rancher Labs 在过去的文章中,我们花了相当大的篇幅来聊关于监控的话题.这是因为当你正在管理Kubernetes集群时,一切都会以极快的速度发生变化.因此有一个工具来监控集群的健康状 ...

  2. Prometheus笔记(二)监控go项目实时给grafana展示

    欢迎加入go语言学习交流群 636728449 Prometheus笔记(二)监控go项目实时给grafana展示 Prometheus笔记(一)metric type 文章目录 一.promethe ...

  3. Prometheus基于consul自动发现监控对象 https://www.iloxp.com/archive/11/

      Prometheus 监控目标为什么要自动发现 频繁对Prometheus配置文件进行修改,无疑给运维人员带来很大的负担,还有可能直接变成一个“配置小王子”,即使是配置小王子也会存在人为失误的情况 ...

  4. 基于 prometheus 的微服务指标监控

    基于prometheus的微服务指标监控 服务上线后我们往往需要对服务进行监控,以便能及早发现问题并做针对性的优化,监控又可分为多种形式,比如日志监控,调用链监控,指标监控等等.而通过指标监控能清晰的 ...

  5. incubator-dolphinscheduler 如何在不写任何新代码的情况下,能快速接入到prometheus和grafana中进行监控

    一.prometheus和grafana 简介 prometheus是由谷歌研发的一款开源的监控软件,目前已经贡献给了apache 基金会托管. 监控通常分为白盒监控和黑盒监控之分. 白盒监控:通过监 ...

  6. ASP.NET Web API 接口执行时间监控

    软件产品常常会出现这样的情况:产品性能因某些无法预料的瓶颈而受到干扰,导致程序的处理效率降低,性能得不到充分的发挥.如何快速有效地找到软件产品的性能瓶颈,则是我们感兴趣的内容之一. 在本文中,我将解释 ...

  7. SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示

    SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示   1,与MVC集成 见http://simpleinjector.codeplex.com/wikipage? ...

  8. 基于Prometheus搭建SpringCloud全方位立体监控体系

    前提 最近公司在联合运维做一套全方位监控的系统,应用集群的技术栈是SpringCloud体系.虽然本人没有参与具体基础架构的研发,但是从应用引入的包和一些资料的查阅大致推算出具体的实现方案,这里做一次 ...

  9. Prometheus 安装Alertmanager集成

    Prometheus 安装Alertmanager集成 # 下载地址 地址1:https://prometheus.io/download/ 地址2:https://github.com/promet ...

随机推荐

  1. Python语法之函数、引用和装饰器

    所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该 任务 ...

  2. Java变量命名规范

    java命名规范 所有方法.变量.类名:见名知意 类成员变量:首字母小写.驼峰原则: 例如:lastName 第一个单词首字母小写,其余首字母大写 局部变量:首字母小写.驼峰原则 类名: 首字母小写. ...

  3. 如何实现LRU缓存

    大家好,我是程序员学长,今天我们来聊一聊LRU缓存问题. Tips: LRU在计算机软件中无处不在,希望大家一定要了解透彻. 问题描述 设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设 ...

  4. golangHTML标签提取器soup

    什么是soup 类似python中beatifulsoup,用于提取html标签提取,多用于爬虫.它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航,搜索以及修改 ...

  5. js不同地图坐标系经纬度转换(天地图,高德地图,百度地图,腾讯地图)

    1.js转换代码 1 //转换常数 2 var x_pi = 3.14159265358979324 * 3000.0 / 180.0; 3 var pi = 3.14159265358979324; ...

  6. awk工作流程

    awk 工作过程:先执行BEGIN模块,再跟文本交互,最后执行END模块.也就是说BEGIN/END模块,这俩是单独操作跟文本是同一级,但执行有优先级,BEGIN模块>文本>END模块 行 ...

  7. 为什么要设置GOROOT/GOPATH

    设置GOROOT的原因 编译器的位置指定的时候,需要指定GO开发包的安装位置,然后设置环境变量PATH的时候,需要指定到安装包下的bin目录,其中就有以下的编译/执行器.所以GOROOT指定了前面的路 ...

  8. xshell与小键盘问题

    有些程序员的键盘是带有小数字键的,在使用xshell中文版时就可能出现一些小状况,本集就同大家分析一下使用数字键盘出现乱码的情况怎么办. 图1:使用数字小键盘出现乱码 问题描述: 在xshell上用v ...

  9. 383 day10缓冲流、转换流、序列化流

    day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 [ ] 能够使用字节缓冲流读取数据到程序 [ ] 能够使用字节缓冲流写出数据到文件 [ ] 能够明确字符缓 ...

  10. 最长公共前缀 js 实现代码

    编写一个函数来查找字符串数组中的最长公共前缀: 输入 : ["abca","abc","abca","abc",&quo ...