commit
8f21170c68
6 changed files with 282 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||||
|
prometheus.yaml |
||||
|
recording_rules.yaml |
||||
@ -0,0 +1,11 @@ |
|||||
|
# Grafana + Prometheus testbed for the Open Code Quest leaderboard |
||||
|
|
||||
|
## Installation |
||||
|
|
||||
|
```sh |
||||
|
sudo ./run.sh |
||||
|
``` |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
Open http://localhost:3000/ and login with admin/admin |
||||
@ -0,0 +1,45 @@ |
|||||
|
version: '3.8' |
||||
|
|
||||
|
networks: |
||||
|
monitoring: {} |
||||
|
|
||||
|
volumes: |
||||
|
prometheus_data: {} |
||||
|
grafana_data: {} |
||||
|
|
||||
|
services: |
||||
|
grafana: |
||||
|
image: docker.io/grafana/grafana-oss:latest |
||||
|
container_name: grafana |
||||
|
restart: unless-stopped |
||||
|
volumes: |
||||
|
- grafana_data:/var/lib/grafana |
||||
|
environment: |
||||
|
- GF_LOG_LEVEL=debug |
||||
|
ports: |
||||
|
- 3000:3000 |
||||
|
expose: |
||||
|
- 3000 |
||||
|
networks: |
||||
|
- monitoring |
||||
|
|
||||
|
prometheus: |
||||
|
image: docker.io/prom/prometheus:latest |
||||
|
container_name: prometheus |
||||
|
restart: unless-stopped |
||||
|
volumes: |
||||
|
- ./prometheus/prometheus.yaml:/etc/prometheus/prometheus.yaml:z |
||||
|
- ./prometheus/recording_rules.yaml:/etc/prometheus/recording_rules.yaml:z |
||||
|
- prometheus_data:/prometheus |
||||
|
command: |
||||
|
- '--config.file=/etc/prometheus/prometheus.yaml' |
||||
|
- '--storage.tsdb.path=/prometheus' |
||||
|
- '--web.console.libraries=/etc/prometheus/console_libraries' |
||||
|
- '--web.console.templates=/etc/prometheus/consoles' |
||||
|
- '--web.enable-lifecycle' |
||||
|
expose: |
||||
|
- 9090 |
||||
|
ports: |
||||
|
- 9090:9090 |
||||
|
networks: |
||||
|
- monitoring |
||||
@ -0,0 +1,12 @@ |
|||||
|
global: |
||||
|
scrape_interval: ${INTERVAL} |
||||
|
evaluation_interval: ${INTERVAL} |
||||
|
|
||||
|
scrape_configs: |
||||
|
- job_name: 'prometheus' |
||||
|
scrape_interval: ${INTERVAL} |
||||
|
static_configs: |
||||
|
- targets: ['localhost:9090'] |
||||
|
|
||||
|
rule_files: |
||||
|
- "/etc/prometheus/recording_rules.yaml" |
||||
@ -0,0 +1,157 @@ |
|||||
|
groups: |
||||
|
- name: opencodequest_base |
||||
|
rules: |
||||
|
- record: opencodequest_users |
||||
|
expr: | |
||||
|
sum( |
||||
|
timestamp( |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "superman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "batman", "","") |
||||
|
) >= bool ${TS_USERS_JOIN} |
||||
|
) by (user) |
||||
|
- record: opencodequest_devspaces_workspaces |
||||
|
expr: | |
||||
|
sum( |
||||
|
timestamp( |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "superman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "batman", "","") |
||||
|
) >= bool ${TS_DEVSPACES} |
||||
|
) by (user) |
||||
|
- record: opencodequest_leaderboard_hero:prod |
||||
|
expr: | |
||||
|
sum( |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "superman", "","")) >= bool ${TS_USER_SUPERMAN_HERO} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","")) >= bool ${TS_USER_CATWOMAN_HERO} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","")) >= bool ${TS_USER_INVISIBLEMAN_HERO} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "batman", "","")) >= bool ${TS_USER_BATMAN_HERO} |
||||
|
) by (user) |
||||
|
- record: opencodequest_leaderboard_villain:prod |
||||
|
expr: | |
||||
|
sum( |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "superman", "","")) >= bool ${TS_USER_SUPERMAN_VILLAIN} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","")) >= bool ${TS_USER_CATWOMAN_VILLAIN} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","")) >= bool ${TS_USER_INVISIBLEMAN_VILLAIN} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "batman", "","")) >= bool ${TS_USER_BATMAN_VILLAIN} |
||||
|
) by (user) |
||||
|
- record: opencodequest_leaderboard_fight:prod |
||||
|
expr: | |
||||
|
sum( |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "superman", "","")) >= bool ${TS_USER_SUPERMAN_FIGHT} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","")) >= bool ${TS_USER_CATWOMAN_FIGHT} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","")) >= bool ${TS_USER_INVISIBLEMAN_FIGHT} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "batman", "","")) >= bool ${TS_USER_BATMAN_FIGHT} |
||||
|
) by (user) |
||||
|
- record: opencodequest_leaderboard_fight_call:prod |
||||
|
expr: | |
||||
|
sum( |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "superman", "","")) >= bool ${TS_USER_SUPERMAN_FIGHT_CALL} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","")) >= bool ${TS_USER_CATWOMAN_FIGHT_CALL} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","")) >= bool ${TS_USER_INVISIBLEMAN_FIGHT_CALL} |
||||
|
or |
||||
|
timestamp(label_replace(up{instance="localhost:9090"}, "user", "batman", "","")) >= bool ${TS_USER_BATMAN_FIGHT_CALL} |
||||
|
) by (user) |
||||
|
- name: opencodequest_step1 |
||||
|
#query_offset: ${OFFSET_STEP1}s |
||||
|
rules: |
||||
|
- record: opencodequest_leaderboard_hero_onetime_bonus:prod |
||||
|
expr: | |
||||
|
(increase(opencodequest_leaderboard_hero:prod[10s]) >= bool 0.5) |
||||
|
* |
||||
|
( |
||||
|
55 |
||||
|
+ |
||||
|
sum( |
||||
|
( |
||||
|
(${TS_EXERCISE_HERO} + ${OFFSET_STEP1}) |
||||
|
- |
||||
|
timestamp( |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "superman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "batman", "","") |
||||
|
) |
||||
|
) / 5 |
||||
|
) by (user) |
||||
|
) |
||||
|
- record: opencodequest_leaderboard_villain_onetime_bonus:prod |
||||
|
expr: | |
||||
|
(increase(opencodequest_leaderboard_villain:prod[10s]) >= bool 0.5) |
||||
|
* |
||||
|
( |
||||
|
25 |
||||
|
+ |
||||
|
sum( |
||||
|
( |
||||
|
(${TS_EXERCISE_VILLAIN} + ${OFFSET_STEP1}) |
||||
|
- |
||||
|
timestamp( |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "superman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "batman", "","") |
||||
|
) |
||||
|
) / 5 |
||||
|
) by (user) |
||||
|
) |
||||
|
- record: opencodequest_leaderboard_fight_onetime_bonus:prod |
||||
|
expr: | |
||||
|
(increase(opencodequest_leaderboard_fight:prod[10s]) >= bool 0.5) |
||||
|
* |
||||
|
( |
||||
|
29 |
||||
|
+ |
||||
|
sum( |
||||
|
( |
||||
|
(${TS_EXERCISE_VILLAIN} + ${OFFSET_STEP1}) |
||||
|
- |
||||
|
timestamp( |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "superman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "invisibleman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "catwoman", "","") |
||||
|
or |
||||
|
label_replace(up{instance="localhost:9090"}, "user", "batman", "","") |
||||
|
) |
||||
|
) / 5 |
||||
|
) by (user) |
||||
|
) |
||||
|
- name: opencodequest_step2 |
||||
|
#query_offset: ${OFFSET_STEP2}s |
||||
|
rules: |
||||
|
- record: opencodequest_leaderboard_hero_lifetime_bonus:prod |
||||
|
expr: | |
||||
|
sum_over_time(opencodequest_leaderboard_hero_onetime_bonus:prod[1h]) |
||||
|
- record: opencodequest_leaderboard_villain_lifetime_bonus:prod |
||||
|
expr: | |
||||
|
sum_over_time(opencodequest_leaderboard_villain_onetime_bonus:prod[1h]) |
||||
|
- record: opencodequest_leaderboard_fight_lifetime_bonus:prod |
||||
|
expr: | |
||||
|
sum_over_time(opencodequest_leaderboard_fight_onetime_bonus:prod[1h]) |
||||
@ -0,0 +1,55 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
set -Eeuo pipefail |
||||
|
|
||||
|
# Prometheus settings |
||||
|
export SCALE="1" # 1 for seconds or 60 for minutes |
||||
|
export INTERVAL="$((SCALE * 5))s" |
||||
|
export OFFSET_STEP1="$((SCALE * 5))" |
||||
|
export OFFSET_STEP2="$((SCALE * 10))" |
||||
|
|
||||
|
# Set the timings |
||||
|
export TS_NOW="$EPOCHSECONDS" |
||||
|
export TS_USERS_JOIN="$(( TS_NOW + SCALE * 10 ))" |
||||
|
export TS_DEVSPACES="$(( TS_NOW + SCALE * 20 ))" |
||||
|
|
||||
|
# Superman is on time |
||||
|
export TS_USER_SUPERMAN_HERO="$(( TS_NOW + SCALE * 55 ))" |
||||
|
export TS_USER_SUPERMAN_VILLAIN="$(( TS_NOW + SCALE * 85 ))" |
||||
|
export TS_USER_SUPERMAN_FIGHT="$(( TS_NOW + SCALE * 130 ))" |
||||
|
export TS_USER_SUPERMAN_FIGHT_CALL="$(( TS_NOW + SCALE * 135 ))" |
||||
|
|
||||
|
# Catwoman is early |
||||
|
export TS_USER_CATWOMAN_HERO="$(( TS_NOW + SCALE * 50 ))" |
||||
|
export TS_USER_CATWOMAN_VILLAIN="$(( TS_NOW + SCALE * 75 ))" |
||||
|
export TS_USER_CATWOMAN_FIGHT="$(( TS_NOW + SCALE * 115 ))" |
||||
|
export TS_USER_CATWOMAN_FIGHT_CALL="$(( TS_NOW + SCALE * 120 ))" |
||||
|
|
||||
|
# Invisible Man is late |
||||
|
export TS_USER_INVISIBLEMAN_HERO="$(( TS_NOW + SCALE * 60 ))" |
||||
|
export TS_USER_INVISIBLEMAN_VILLAIN="$(( TS_NOW + SCALE * 95 ))" |
||||
|
export TS_USER_INVISIBLEMAN_FIGHT="$(( TS_NOW + SCALE * 145 ))" |
||||
|
export TS_USER_INVISIBLEMAN_FIGHT_CALL="$(( TS_NOW + SCALE * 150 ))" |
||||
|
|
||||
|
# Batman is late but will catch up |
||||
|
export TS_USER_BATMAN_HERO="$(( TS_NOW + SCALE * 65 ))" |
||||
|
export TS_USER_BATMAN_VILLAIN="$(( TS_NOW + SCALE * 70 ))" |
||||
|
export TS_USER_BATMAN_FIGHT="$(( TS_NOW + SCALE * 100 ))" |
||||
|
export TS_USER_BATMAN_FIGHT_CALL="$(( TS_NOW + SCALE * 110 ))" |
||||
|
|
||||
|
# Expected timings for the exercises |
||||
|
export TS_EXERCISE_HERO="$(( TS_NOW + SCALE * 55 ))" |
||||
|
export TS_EXERCISE_VILLAIN="$(( TS_NOW + SCALE * 85 ))" |
||||
|
export TS_EXERCISE_FIGHT="$(( TS_NOW + SCALE * 130 ))" |
||||
|
export TS_EXERCISE_FIGHT_CALL="$(( TS_NOW + SCALE * 135 ))" |
||||
|
|
||||
|
# Process the template |
||||
|
envsubst < prometheus/prometheus.yaml.template > prometheus/prometheus.yaml |
||||
|
envsubst < prometheus/recording_rules.yaml.template > prometheus/recording_rules.yaml |
||||
|
|
||||
|
# Reload recording rules and remove all data |
||||
|
sudo podman stop prometheus || true |
||||
|
sudo podman rm prometheus || true |
||||
|
sudo podman volume rm prometheus-grafana-testbed_prometheus_data || true |
||||
|
sudo podman-compose up -d |
||||
|
sudo podman logs -f prometheus |
||||
Loading…
Reference in new issue