-
-
Notifications
You must be signed in to change notification settings - Fork 377
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[skip changelog] Gather downloads stats from GitHub releases (#665)
* add stats script * send metrics * add failure event and comments * confusing languages * testing failures * revert, failures reporting works ok * rename file, remove test clause
- Loading branch information
Massimiliano Pippi
authored
Apr 22, 2020
1 parent
0c1f41b
commit ecb3f52
Showing
1 changed file
with
90 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
name: download-stats | ||
|
||
on: | ||
schedule: | ||
# run every 5 minutes | ||
- cron: '*/5 * * * *' | ||
|
||
jobs: | ||
push-stats: | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Fetch downloads count | ||
id: fetch | ||
uses: actions/[email protected] | ||
with: | ||
github-token: ${{github.token}} | ||
script: | | ||
let metrics = [] | ||
// Get a list of releases | ||
const opts = github.repos.listReleases.endpoint.merge({ | ||
...context.repo | ||
}) | ||
const releases = await github.paginate(opts) | ||
// Get download stats for every release | ||
for (const rel of releases) { | ||
// Names for assets are like `arduino-cli_0.4.0_Linux_32bit.tar.gz`, | ||
// we'll use this later to split the asset file name more easily | ||
const baseName = `arduino-cli_${rel.name}_` | ||
// Get a list of assets for this release | ||
const opts = github.repos.listAssetsForRelease.endpoint.merge({ | ||
...context.repo, | ||
release_id: rel.id | ||
}) | ||
const assets = await github.paginate(opts) | ||
for (const asset of assets) { | ||
// Ignore files that are not arduino-cli packages | ||
if (!asset.name.startsWith(baseName)) { | ||
continue | ||
} | ||
// Strip the base and remove file extension to get `Linux_32bit` | ||
systemArch = asset.name.replace(baseName, "").split(".")[0].split("_") | ||
// Add a metric object to the list of gathered metrics | ||
metrics.push({ | ||
"type": "gauge", | ||
"name": "arduino.downloads.total", | ||
"value": asset.download_count, | ||
"host": "${{ github.repository }}", | ||
"tags": [ | ||
`version:${rel.name}`, | ||
`os:${systemArch[0]}`, | ||
`arch:${systemArch[1]}`, | ||
"cdn:github.com", | ||
"project:arduino-cli" | ||
] | ||
}) | ||
} | ||
} | ||
// The action will put whatever we return from this function in | ||
// `outputs.result`, JSON encoded. So we just return the array | ||
// of objects and GitHub will do the rest. | ||
return metrics | ||
- name: Send metrics | ||
uses: masci/datadog@v1 | ||
with: | ||
api-key: ${{ secrets.DD_API_KEY }} | ||
# Metrics input expects YAML but JSON will work just right. | ||
metrics: ${{steps.fetch.outputs.result}} | ||
|
||
- name: Report failure | ||
if: failure() | ||
uses: masci/datadog@v1 | ||
with: | ||
api-key: ${{ secrets.DD_API_KEY }} | ||
events: | | ||
- title: "Arduino CLI stats failing" | ||
text: "Stats collection failed" | ||
alert_type: "error" | ||
host: ${{ github.repository }} | ||
tags: | ||
- "project:arduino-cli" | ||
- "cdn:github.com" |