jenkins exporter(收集jenkins构建结果)
时间:2019-11-26
本文章向大家介绍jenkins exporter(收集jenkins构建结果),主要包括jenkins exporter(收集jenkins构建结果)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
import re import time import requests import argparse from pprint import pprint import os from sys import exit from prometheus_client import start_http_server, Summary from prometheus_client.core import GaugeMetricFamily, REGISTRY DEBUG = int(os.environ.get('DEBUG', '0')) #DEBUG = True COLLECTION_TIME = Summary('jenkins_collector_collect_seconds', 'Time spent to collect metrics from Jenkins') class JenkinsCollector(object): # The build statuses we want to export about. #statuses = ["lastBuild", "lastCompletedBuild", "lastFailedBuild", # "lastStableBuild", "lastSuccessfulBuild", "lastUnstableBuild", # "lastUnsuccessfulBuild"] statuses = ["lastBuild","lastFailedBuild", "lastSuccessfulBuild", "lastUnstableBuild" ] def __init__(self, target, user, password, insecure): self._target = target.rstrip("/") self._user = user self._password = password self._insecure = insecure def collect(self): start = time.time() # Request data from Jenkins jobs = self._request_data() self._setup_empty_prometheus_metrics() for job in jobs: name = job['fullName'] if DEBUG: print("Found Job: {}".format(name)) pprint(job) self._get_metrics(name, job) for status in self.statuses: for metric in self._prometheus_metrics[status].values(): yield metric duration = time.time() - start COLLECTION_TIME.observe(duration) def _request_data(self): # Request exactly the information we need from Jenkins url = '{0}/api/json'.format(self._target) jobs = "[fullName,number,timestamp,duration,actions[queuingDurationMillis,totalDurationMillis," \ "skipCount,failCount,totalCount,passCount]]" tree = 'jobs[fullName,url,{0}]'.format(','.join([s + jobs for s in self.statuses])) params = { 'tree': tree, } def parsejobs(myurl): # params = tree: jobs[name,lastBuild[number,timestamp,duration,actions[queuingDurationMillis... if self._user and self._password: response = requests.get(myurl, params=params, auth=(self._user, self._password), verify=(not self._insecure)) else: response = requests.get(myurl, params=params, verify=(not self._insecure)) if DEBUG: pprint(response.text) if response.status_code != requests.codes.ok: raise Exception("Call to url %s failed with status: %s" % (myurl, response.status_code)) result = response.json() if DEBUG: pprint(result) jobs = [] for job in result['jobs']: if job['_class'] == 'com.cloudbees.hudson.plugins.folder.Folder' or \ job['_class'] == 'jenkins.branch.OrganizationFolder' or \ job['_class'] == 'org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject': jobs += parsejobs(job['url'] + '/api/json') else: jobs.append(job) return jobs return parsejobs(url) def _setup_empty_prometheus_metrics(self): # The metrics we want to export. self._prometheus_metrics = {} for status in self.statuses: snake_case = re.sub('([A-Z])', '_\\1', status).lower() self._prometheus_metrics[status] = { 'number': GaugeMetricFamily('jenkins_job_{0}'.format(snake_case), 'Jenkins build number for {0}'.format(status), labels=["jobname"]), 'duration': GaugeMetricFamily('jenkins_job_{0}_duration_seconds'.format(snake_case), 'Jenkins build duration in seconds for {0}'.format(status), labels=["jobname"]), 'timestamp': GaugeMetricFamily('jenkins_job_{0}_timestamp_seconds'.format(snake_case), 'Jenkins build timestamp in unixtime for {0}'.format(status), labels=["jobname"]), 'queuingDurationMillis': GaugeMetricFamily('jenkins_job_{0}_queuing_duration_seconds'.format(snake_case), 'Jenkins build queuing duration in seconds for {0}'.format(status), labels=["jobname"]), 'totalDurationMillis': GaugeMetricFamily('jenkins_job_{0}_total_duration_seconds'.format(snake_case), 'Jenkins build total duration in seconds for {0}'.format(status), labels=["jobname"]), 'skipCount': GaugeMetricFamily('jenkins_job_{0}_skip_count'.format(snake_case), 'Jenkins build skip counts for {0}'.format(status), labels=["jobname"]), 'failCount': GaugeMetricFamily('jenkins_job_{0}_fail_count'.format(snake_case), 'Jenkins build fail counts for {0}'.format(status), labels=["jobname"]), 'totalCount': GaugeMetricFamily('jenkins_job_{0}_total_count'.format(snake_case), 'Jenkins build total counts for {0}'.format(status), labels=["jobname"]), 'passCount': GaugeMetricFamily('jenkins_job_{0}_pass_count'.format(snake_case), 'Jenkins build pass counts for {0}'.format(status), labels=["jobname"]), } def _get_metrics(self, name, job): for status in self.statuses: if status in job.keys(): status_data = job[status] or {} self._add_data_to_prometheus_structure(status, status_data, job, name) def _add_data_to_prometheus_structure(self, status, status_data, job, name): # If there's a null result, we want to pass. if status_data.get('duration', 0): self._prometheus_metrics[status]['duration'].add_metric([name], status_data.get('duration') / 1000.0) #if status_data.get('timestamp', 0): # self._prometheus_metrics[status]['timestamp'].add_metric([name], status_data.get('timestamp') / 1000.0) if status_data.get('number', 0): self._prometheus_metrics[status]['number'].add_metric([name], status_data.get('number')) actions_metrics = status_data.get('actions', [{}]) for metric in actions_metrics: if metric.get('queuingDurationMillis', False): self._prometheus_metrics[status]['queuingDurationMillis'].add_metric([name], metric.get('queuingDurationMillis') / 1000.0) if metric.get('totalDurationMillis', False): self._prometheus_metrics[status]['totalDurationMillis'].add_metric([name], metric.get('totalDurationMillis') / 1000.0) if metric.get('skipCount', False): self._prometheus_metrics[status]['skipCount'].add_metric([name], metric.get('skipCount')) if metric.get('failCount', False): self._prometheus_metrics[status]['failCount'].add_metric([name], metric.get('failCount')) if metric.get('totalCount', False): self._prometheus_metrics[status]['totalCount'].add_metric([name], metric.get('totalCount')) # Calculate passCount by subtracting fails and skips from totalCount passcount = metric.get('totalCount') - metric.get('failCount') - metric.get('skipCount') self._prometheus_metrics[status]['passCount'].add_metric([name], passcount) def parse_args(): parser = argparse.ArgumentParser( description='jenkins exporter args jenkins address and port' ) parser.add_argument( '-j', '--jenkins', metavar='jenkins', required=False, help='server url from the jenkins api', default=os.environ.get('JENKINS_SERVER', 'http://jenkins:8080') ) parser.add_argument( '--user', metavar='user', required=False, help='jenkins api user', default=os.environ.get('JENKINS_USER') ) parser.add_argument( '--password', metavar='password', required=False, help='jenkins api password', default=os.environ.get('JENKINS_PASSWORD') ) parser.add_argument( '-p', '--port', metavar='port', required=False, type=int, help='Listen to this port', default=int(os.environ.get('VIRTUAL_PORT', '8080')) ) parser.add_argument( '-k', '--insecure', dest='insecure', required=False, action='store_true', help='Allow connection to insecure Jenkins API', default=False ) return parser.parse_args() def main(): try: args = parse_args() port = int(args.port) REGISTRY.register(JenkinsCollector(args.jenkins, args.user, args.password, args.insecure)) start_http_server(port) print("Polling {}. Serving at port: {}".format(args.jenkins, port)) while True: time.sleep(1) except KeyboardInterrupt: print(" Interrupted") exit(0) if __name__ == "__main__": main()
原文地址:https://www.cnblogs.com/qinghe123/p/11934027.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 工具系列 | H5如何实现人脸识别
- 形式化分析工具(六):HLPSL Tutorial(Example3)
- CODING DevOps + Nginx-ingress 实现自动化灰度发布
- TF入门04-TF实现Word2Vec
- TF入门03-实现线性回归&逻辑回归
- TF入门02-TensorFlow Ops
- 前端|利用Verify插件实现前端图像验证码
- 3分钟短文 | PHP位运算和逻辑运算,一个符号写两遍这么简单?
- 打卡群刷题总结0721——搜索二维矩阵
- NumPy进阶80题完整版|附Notebook版本下载
- 【LeetCode每日一题】21. Merge Two Sorted Lists
- 计算广告笔记06-程序化交易广告
- TF入门05-实验过程管理
- [LeetCode]709. To Lower Case
- ISO C forbids comparison between pointer and integer [-fpermissive]