DEV Community

Cover image for Get detailed analytics and statistics from your Github Actions
Michel Canta
Michel Canta

Posted on

Get detailed analytics and statistics from your Github Actions

I love Github Actions, love building them, love using them and love helping others use them. But that last part is a bit difficult as Github does not provide a way to get analytical data on your action's usage by others such as: Who uses it? How often are they using it? Are there any errors when people try to use it? Do people try to use it and then decide not to due to some problems? Etc…

By getting the answers to these questions, Actions developers would be able to improve their actions to suit the needs of more people and make the experience for users better. So we decided to solve this problem and give developers the insights they need.


Getting Started
Start by creating you action, we'll be using the code from Github's tutorial on creating a new JS action you can find here.

const core = require('@actions/core');
const github = require('@actions/github');

try {
  // `who-to-greet` input defined in action metadata file
  const nameToGreet = core.getInput('who-to-greet');
  console.log(`Hello ${nameToGreet}!`);
  const time = (new Date()).toTimeString();
  core.setOutput("time", time);
  // Get the JSON webhook payload for the event that triggered the workflow
  const payload = JSON.stringify(github.context.payload, undefined, 2)
  console.log(`The event payload: ${payload}`);
} catch (error) {
  core.setFailed(error.message);
}
Enter fullscreen mode Exit fullscreen mode

To start collecting data we install the gh-action-stats npm package:

npm install -S gh-action-stats
Enter fullscreen mode Exit fullscreen mode

And then import it into our action and call the collectStats function as such:

const core = require('@actions/core');
const github = require('@actions/github');
const collectStats = require('gh-action-stats');

try {
  collectStats(); // You can collect stats at any point in the action.
  // `who-to-greet` input defined in action metadata file
  const nameToGreet = core.getInput('who-to-greet');
  console.log(`Hello ${nameToGreet}!`);
  const time = (new Date()).toTimeString();
  core.setOutput("time", time);
  // Get the JSON webhook payload for the event that triggered the workflow
  const payload = JSON.stringify(github.context.payload, undefined, 2)
  console.log(`The event payload: ${payload}`);
} catch (error) {
  core.setFailed(error.message);
}
Enter fullscreen mode Exit fullscreen mode

By doing this you will start collecting statistics on your action once it is run in the context of a runner (does not currently support self hosted runners).

Collecting Run Statistics
The configuration above will work well but will leave out two key pieces of information: Errors and Duration of the run (how long did your action take to run).
To get these information we need to call the collectStats function differently:

const core = require('@actions/core');
const github = require('@actions/github');
const collectStats = require('gh-action-stats');

function main() {
  try {
    // `who-to-greet` input defined in action metadata file
    const nameToGreet = core.getInput('who-to-greet');
    console.log(`Hello ${nameToGreet}!`);
    const time = (new Date()).toTimeString();
    core.setOutput("time", time);
    // Get the JSON webhook payload for the event that triggered the workflow
    const payload = JSON.stringify(github.context.payload, undefined, 2)
    console.log(`The event payload: ${payload}`);
  } catch (error) {
    core.setFailed(error.message);
    // Rethrow the error so that it can be caught and logged 
    // by gh-action-stats 
    throw error; 
  }
}

collectStats(main);
Enter fullscreen mode Exit fullscreen mode

By creating a main function, and passing it to the collectStats function, gh-action-stats will be able to execute your main function (even if it is async), collect all the previous statistics, catch errors and log them, and monitor run duration!

Accessing Data
Once you've configured your action to collect statistics, you will want to access your data. Go to actions.boringday.co and log-in using your Github account. Note, you will only be able to see the statistics for the actions you own (i.e. which you are the creator of). Once logged in and some run data has been collected you will have your dashboard with the list of the actions you own and the last time they were used.

List of all your actions which currently have data

Select the action you wish to visualize and the following dashboard will appear giving you insights on your action.

Dashboard for my version-bumper actions

Notes
For the privacy of those using the actions, you will not be able to see the name of the repository if it is private to you, you will still be able to see the repo owner's name though if you want to contact them.
You can find the repository for the platform here: https://github.com/michmich112/gh-action-stats 
And the npm package here: https://github.com/michmich112/gh-action-stats-js 
You can visit our feature plans there and contributions are welcome!
This currently only works for JS Actions only, support for Docker images is on the way.

Top comments (2)

Collapse
 
jankapunkt profile image
Jan Küster

The links to the repo and npm are 404, can you check please?

Collapse
 
michmich112 profile image
Michel Canta

Cheers, there was an extra space at the end. thx!