diff --git a/.github/workflows/github-stats.yaml b/.github/workflows/github-stats.yaml new file mode 100644 index 00000000000..f246c879689 --- /dev/null +++ b/.github/workflows/github-stats.yaml @@ -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/github-script@0.2.0 + 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"