Skip to content

Commit

Permalink
added new approach for collecting the metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
emamihe authored and pepoviola committed Nov 10, 2023
1 parent 95b7662 commit 2e3500e
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 0 deletions.
13 changes: 13 additions & 0 deletions scripts/jobs_status_exporter/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM python:3.10-slim

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY metrics.py .

CMD ["python", "./metrics.py"]
30 changes: 30 additions & 0 deletions scripts/jobs_status_exporter/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-deployment
labels:
app: metrics
spec:
replicas: 1
selector:
matchLabels:
app: metrics
template:
metadata:
labels:
app: metrics
spec:
containers:
- name: metrics
image: emamihe/gitlab-runner-metrics:1.0
ports:
- containerPort: 8000
name: http-metrics
env:
- name: GITLAB_PRIVATE_TOKEN
valueFrom:
secretKeyRef:
name: gitlab-token
key: token
- name: RUNNER_ID
value: "RkrwHxX5"
48 changes: 48 additions & 0 deletions scripts/jobs_status_exporter/metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import os
import requests
import time
from prometheus_client import start_http_server, Gauge

GITLAB_API_ENDPOINT = 'https://gitlab.parity.io/api/v4/runners/{}/jobs'
GITLAB_PRIVATE_TOKEN = os.getenv('GITLAB_PRIVATE_TOKEN')
RUNNER_ID = os.getenv('RUNNER_ID')

if not GITLAB_PRIVATE_TOKEN or not RUNNER_ID:
raise EnvironmentError('The environment variables GITLAB_PRIVATE_TOKEN and RUNNER_ID must be set.')

status_gauges = {
'created': Gauge('gitlab_runner_jobs_created', 'Number of created jobs'),
'pending': Gauge('gitlab_runner_jobs_pending', 'Number of pending jobs'),
'running': Gauge('gitlab_runner_jobs_running', 'Number of running jobs'),
'failed': Gauge('gitlab_runner_jobs_failed', 'Number of failed jobs'),
'success': Gauge('gitlab_runner_jobs_success', 'Number of successful jobs'),
'canceled': Gauge('gitlab_runner_jobs_canceled', 'Number of canceled jobs'),
'skipped': Gauge('gitlab_runner_jobs_skipped', 'Number of skipped jobs'),
'manual': Gauge('gitlab_runner_jobs_manual', 'Number of manual jobs'),
}

def fetch_jobs_by_runner(runner_id):
"""Fetch jobs from a specific GitLab Runner and update Prometheus metrics."""
headers = {'PRIVATE-TOKEN': GITLAB_PRIVATE_TOKEN}
response = requests.get(GITLAB_API_ENDPOINT.format(runner_id), headers=headers)
response.raise_for_status()
jobs = response.json()

for gauge in status_gauges.values():
gauge.set(0)

for job in jobs:
status = job.get('status')
if status in status_gauges:
status_gauges[status].inc()

def main():
start_http_server(8000)
print("Metrics server running on port 8000")

while True:
fetch_jobs_by_runner(RUNNER_ID)
time.sleep(60)

if __name__ == '__main__':
main()
1 change: 1 addition & 0 deletions scripts/jobs_status_exporter/runner_id
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
175886
13 changes: 13 additions & 0 deletions scripts/jobs_status_exporter/service-monitor.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: metrics-servicemonitor
labels:
app: metrics
spec:
selector:
matchLabels:
app: metrics
endpoints:
- port: http-metrics
interval: 15s
12 changes: 12 additions & 0 deletions scripts/jobs_status_exporter/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: metrics-service
labels:
app: metrics
spec:
selector:
app: metrics
ports:
- port: 8000
targetPort: http-metrics

0 comments on commit 2e3500e

Please sign in to comment.