Skip to content

Commit 3cb7383

Browse files
authored
Send nightly builds statistics to monitoring #1335 (#1363)
1 parent 24f8f56 commit 3cb7383

File tree

4 files changed

+57
-10
lines changed

4 files changed

+57
-10
lines changed

.github/workflows/collect-statistics.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ env:
6262
data_path: monitoring/data
6363
monitoring_properties: monitoring/monitoring.properties
6464
push_script: monitoring/push_with_rebase.sh
65+
PUSHGATEWAY_HOSTNAME: monitoring.utbot.org
66+
PUSHGATEWAY_ADDITIONAL_PATH: /pushgateway-custom
67+
PROM_ADDITIONAL_LABELS: /service/github
6568

6669
jobs:
6770
setup_matrix:
@@ -136,7 +139,7 @@ jobs:
136139
id: insert
137140
shell: bash
138141
run: |
139-
OUT_FILE="$data_path/$date-$branch-$short_commit-${{ matrix.value }}.json"
142+
OUT_FILE="$data_path/$date-$short_commit-${{ matrix.value }}.json"
140143
echo "output=$OUT_FILE" >> $GITHUB_OUTPUT
141144
142145
INPUTS=($(seq ${{ inputs.run_number }}))
@@ -184,7 +187,9 @@ jobs:
184187
if: ${{ inputs.send_to_grafana }}
185188
run: |
186189
python monitoring/prepare_metrics.py --stats_file $stats_file --output_file grafana_metrics.json
187-
echo "TODO send metrics to grafana"
190+
chmod +x scripts/project/json_to_prometheus.py
191+
python3 scripts/project/json_to_prometheus.py grafana_metrics.json | curl -u "${{ secrets.PUSHGATEWAY_USER }}:${{ secrets.PUSHGATEWAY_PASSWORD }}" --data-binary @- "https://${PUSHGATEWAY_HOSTNAME}${PUSHGATEWAY_ADDITIONAL_PATH}/metrics/job/pushgateway-custom/instance/run-${{ matrix.value }}${PROM_ADDITIONAL_LABELS}"
192+
echo "Please visit Grafana to check metrics: https://monitoring.utbot.org/d/m6bagaD4z/utbot-nightly-statistic"
188193
env:
189194
stats_file: ${{ steps.insert.outputs.output }}
190195

.github/workflows/run-chosen-tests-from-branch.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ on:
3030
env:
3131
# Environment variable setting gradle options.
3232
GRADLE_OPTS: "-XX:MaxHeapSize=2048m -Dorg.gradle.jvmargs='-XX:MaxHeapSize=2048m -XX:MaxPermSize=512m -Dorg.gradle.daemon=false' -Dorg.gradle.daemon=false"
33+
PUSHGATEWAY_HOSTNAME: monitoring.utbot.org
3334

3435
jobs:
3536
run-chosen-tests:
@@ -46,7 +47,7 @@ jobs:
4647
run: |
4748
echo Find your Prometheus metrics using label {instance=\"${GITHUB_RUN_ID}-${HOSTNAME}\"}
4849
chmod +x ./scripts/project/monitoring.sh
49-
./scripts/project/monitoring.sh ${{ secrets.PUSHGATEWAY_HOSTNAME }} ${{ secrets.PUSHGATEWAY_USER }} ${{ secrets.PUSHGATEWAY_PASSWORD }}
50+
./scripts/project/monitoring.sh ${PUSHGATEWAY_HOSTNAME} ${{ secrets.PUSHGATEWAY_USER }} ${{ secrets.PUSHGATEWAY_PASSWORD }}
5051
5152
- name: Run chosen tests
5253
run: |

monitoring/prepare_metrics.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,14 @@ def build_metrics_from_data_array(metrics: List[dict], labels: dict) -> List[dic
8282
return result
8383

8484

85-
def build_metrics_from_target(target: dict, runner: str) -> List[dict]:
85+
def build_metrics_from_target(target: dict, run_id: str) -> List[dict]:
8686
result = []
8787
project = target["target"]
8888

8989
result.extend(build_metrics_from_data_array(
9090
target["summarised"],
9191
{
92-
"runner": runner,
92+
"run_id": run_id,
9393
"project": project,
9494
"class": "All"
9595
}
@@ -100,7 +100,7 @@ def build_metrics_from_target(target: dict, runner: str) -> List[dict]:
100100
result.extend(build_metrics_from_data_array(
101101
class_item["data"],
102102
{
103-
"runner": runner,
103+
"run_id": run_id,
104104
"project": project,
105105
"class": class_name
106106
}
@@ -109,10 +109,10 @@ def build_metrics_from_target(target: dict, runner: str) -> List[dict]:
109109
return result
110110

111111

112-
def build_metrics_from_targets(targets: List[dict], runner: str) -> List[dict]:
112+
def build_metrics_from_targets(targets: List[dict], run_id: str) -> List[dict]:
113113
metrics = []
114114
for target in targets:
115-
metrics.extend(build_metrics_from_target(target, runner))
115+
metrics.extend(build_metrics_from_target(target, run_id))
116116
return metrics
117117

118118

@@ -131,11 +131,16 @@ def get_args():
131131
return args
132132

133133

134+
def extract_run_id(text: str):
135+
idx = text.find('-')
136+
return "run" + text[idx:]
137+
138+
134139
def main():
135140
args = get_args()
136141
stats = load(args.stats_file)
137-
runner = stats["metadata"]["environment"]["host"]
138-
metrics = build_metrics_from_targets(stats["targets"], runner)
142+
run_id = extract_run_id(stats["metadata"]["source"]["id"])
143+
metrics = build_metrics_from_targets(stats["targets"], run_id)
139144
metrics.sort(key=lambda x: x["metric"])
140145
with open(args.output_file, "w") as f:
141146
json.dump(metrics, f, indent=4)

scripts/project/json_to_prometheus.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import sys
2+
import json
3+
4+
with open(sys.argv[1]) as metrics_raw:
5+
metrics_json = json.load(metrics_raw)
6+
7+
# metrics is a json list e.g.:
8+
# [
9+
# {
10+
# "metric": "total_classes",
11+
# "labels": {
12+
# "project": "guava",
13+
# "fuzzing_ratio": 0.1
14+
# },
15+
# "value": 20
16+
# },
17+
# {
18+
# "metric": "testcases_generated",
19+
# "labels": {
20+
# "project": "guava",
21+
# "fuzzing_ratio": 0.1
22+
# },
23+
# "value": 1042
24+
# }
25+
# ]
26+
#
27+
# the loop below iterates over each list item and constructs metrics set
28+
metrics_set_str = ""
29+
for metric in metrics_json:
30+
labels_set_str = ""
31+
comma = ""
32+
for label, value in metric['labels'].items():
33+
labels_set_str = f'{labels_set_str}{comma}{label}=\"{value}\"'
34+
comma = ","
35+
metrics_set_str += f'{metric["metric"]}{{{labels_set_str}}} {metric["value"]}\n'
36+
print(metrics_set_str)

0 commit comments

Comments
 (0)