Skip to content

Conversation

@ChrsMark
Copy link
Member

@ChrsMark ChrsMark commented Feb 11, 2026

Description

This PR adds a workflow that reports code-owners' activity. The workflow only focuses on components that are listed for stability at #44130 since that's the main priority for now. We can expand the report for all components in contrib but that might be a bit noisy.

Similar work is done in other SIGs, i.e open-telemetry/opentelemetry-js#5898

Link to tracking issue

Related to open-telemetry/opentelemetry-collector#14107

Testing

Running locally with:

export DRY_RUN=1
export GITHUB_TOKEN=ghp_foobarzet
node -e "
const { Octokit } = require('@octokit/rest');
const script = require('./.github/workflows/scripts/generate-codeowners-activity.js');
const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
script({
  github: { rest: octokit },
  context: { payload: { repository: { owner: { login: 'open-telemetry' } } } }
});
"

Documentation

~

AI Usage disclaimer

The script of this PR is crafted mainly by using Cursor taking inspiration from the Weekly Report workflow script: /.github/workflows/scripts/generate-weekly-report.js

<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue.
Ex. Adding a feature - Explain what this achieves.-->
#### Description

<!-- Issue number (e.g. open-telemetry#1234) or full URL to issue, if applicable. -->
#### Link to tracking issue
Fixes

<!--Describe what testing was performed and which tests were added.-->
#### Testing

<!--Describe the documentation added.-->
#### Documentation

<!--Please delete paragraphs that you did not use before submitting.-->

---------

Signed-off-by: ChrsMark <[email protected]>
Signed-off-by: ChrsMark <[email protected]>
@ChrsMark
Copy link
Member Author

ChrsMark commented Feb 11, 2026

Sample output from the dry run:

Code owner activity report

Period: 2026-01-12 – 2026-02-11

Each code owner (individuals only) must have reviewed or replied to at least 80% of the PRs and issues where they were the code owner for the component.

Components in scope: processor/filter, processor/k8sattributes, processor/resourcedetection, processor/transform, receiver/filelog, receiver/hostmetrics, receiver/prometheus (and processor/resourcedetection/* sub-labels).

PRs
Code owner Component Total Responded % Meets 80%?
andrzej-stencel receiver/filelog 5 2 40% No
Aneurysm9 processor/resourcedetection 49 0 0% No
Aneurysm9 processor/resourcedetection/internal/akamai 1 0 0% No
Aneurysm9 processor/resourcedetection/internal/azure 2 0 0% No
Aneurysm9 processor/resourcedetection/internal/hetzner 1 0 0% No
Aneurysm9 processor/resourcedetection/internal/scaleway 1 0 0% No
Aneurysm9 processor/resourcedetection/internal/vultr 1 0 0% No
Aneurysm9 receiver/prometheus 15 0 0% No
ArthurSens receiver/prometheus 13 4 31% No
bogdandrutu processor/filter 7 0 0% No
bogdandrutu processor/transform 5 0 0% No
braydonk receiver/hostmetrics 3 0 0% No
ChrsMark processor/k8sattributes 20 16 80% Yes
dashpole processor/resourcedetection 61 26 43% No
dashpole processor/resourcedetection/internal/akamai 2 1 50% No
dashpole processor/resourcedetection/internal/alibaba/ecs 2 0 0% No
dashpole processor/resourcedetection/internal/azure 4 1 25% No
dashpole processor/resourcedetection/internal/digitalocean 3 0 0% No
dashpole processor/resourcedetection/internal/hetzner 2 0 0% No
dashpole processor/resourcedetection/internal/oraclecloud 4 0 0% No
dashpole processor/resourcedetection/internal/scaleway 3 0 0% No
dashpole processor/resourcedetection/internal/upcloud 3 0 0% No
dashpole processor/resourcedetection/internal/vultr 2 0 0% No
dashpole receiver/prometheus 17 5 29% No
dmitryax processor/k8sattributes 25 2 8% No
dmitryax receiver/hostmetrics 4 2 50% No
edmocosta processor/filter 6 1 17% No
edmocosta processor/transform 5 2 40% No
evan-bradley processor/filter 7 2 29% No
evan-bradley processor/transform 5 1 20% No
fatsheep9146 processor/k8sattributes 25 0 0% No
krajorama receiver/prometheus 15 3 20% No
odubajDT processor/k8sattributes 11 6 55% No
rogercoll receiver/hostmetrics 2 1 50% No
TylerHelmuth processor/filter 7 0 0% No
TylerHelmuth processor/k8sattributes 25 0 0% No
TylerHelmuth processor/transform 5 0 0% No
PRs below threshold
Code owner Component Total Responded % Meets 80%?
andrzej-stencel receiver/filelog 5 2 40% No
Aneurysm9 processor/resourcedetection 49 0 0% No
Aneurysm9 processor/resourcedetection/internal/akamai 1 0 0% No
Aneurysm9 processor/resourcedetection/internal/azure 2 0 0% No
Aneurysm9 processor/resourcedetection/internal/hetzner 1 0 0% No
Aneurysm9 processor/resourcedetection/internal/scaleway 1 0 0% No
Aneurysm9 processor/resourcedetection/internal/vultr 1 0 0% No
Aneurysm9 receiver/prometheus 15 0 0% No
ArthurSens receiver/prometheus 13 4 31% No
bogdandrutu processor/filter 7 0 0% No
bogdandrutu processor/transform 5 0 0% No
braydonk receiver/hostmetrics 3 0 0% No
dashpole processor/resourcedetection 61 26 43% No
dashpole processor/resourcedetection/internal/akamai 2 1 50% No
dashpole processor/resourcedetection/internal/alibaba/ecs 2 0 0% No
dashpole processor/resourcedetection/internal/azure 4 1 25% No
dashpole processor/resourcedetection/internal/digitalocean 3 0 0% No
dashpole processor/resourcedetection/internal/hetzner 2 0 0% No
dashpole processor/resourcedetection/internal/oraclecloud 4 0 0% No
dashpole processor/resourcedetection/internal/scaleway 3 0 0% No
dashpole processor/resourcedetection/internal/upcloud 3 0 0% No
dashpole processor/resourcedetection/internal/vultr 2 0 0% No
dashpole receiver/prometheus 17 5 29% No
dmitryax processor/k8sattributes 25 2 8% No
dmitryax receiver/hostmetrics 4 2 50% No
edmocosta processor/filter 6 1 17% No
edmocosta processor/transform 5 2 40% No
evan-bradley processor/filter 7 2 29% No
evan-bradley processor/transform 5 1 20% No
fatsheep9146 processor/k8sattributes 25 0 0% No
krajorama receiver/prometheus 15 3 20% No
odubajDT processor/k8sattributes 11 6 55% No
rogercoll receiver/hostmetrics 2 1 50% No
TylerHelmuth processor/filter 7 0 0% No
TylerHelmuth processor/k8sattributes 25 0 0% No
TylerHelmuth processor/transform 5 0 0% No

@ChrsMark
Copy link
Member Author

@mx-psi here is an attempt to count reviews per codeowner of the specific components that are targeting stability. I suggest that we focus on those only for now so as to avoid extra noise by checking the vast list of Contrib's components :).

I wonder if 80% target is quite high though specially when we timeframe in a monthly period. Happy to tune the targets/checks accordingly.

Also I only have the report for PRs but we can expand to report issues' stats as well if we find this useful either now or enable it on a later iteration.

@paulojmdias
Copy link
Member

Should the report measure the PRs created by the codeowner itself ? Looking into my values, most of the PRs was created by me and I cannot review it 😅

@ChrsMark
Copy link
Member Author

Should the report measure the PRs created by the codeowner itself ? Looking into my values, most of the PRs was created by me and I cannot review it 😅

Yeap, that's correct :) . I updated the logic and sample output: fb9e0e1#diff-3005a22a150a86354b703948d26e08bbf1654ac09b994e6ae7124114580740b3R255

@ChrsMark
Copy link
Member Author

ChrsMark commented Feb 12, 2026

Updated output sample:

Code owner activity report

Period: 2026-01-13 – 2026-02-12

Each code owner (individuals only) must have reviewed or replied to at least 80% of the PRs and issues where they were the code owner for the component.

Components in scope: processor/filter, processor/k8sattributes, processor/resourcedetection, processor/transform, receiver/filelog, receiver/hostmetrics, receiver/prometheus (and processor/resourcedetection/* sub-labels).

PRs
Code owner Component Total Responded % Meets 80%?
bogdandrutu processor/filter 7 0 0% No
edmocosta processor/filter 6 1 17% No
evan-bradley processor/filter 7 2 29% No
TylerHelmuth processor/filter 7 0 0% No
ChrsMark processor/k8sattributes 17 12 71% No
dmitryax processor/k8sattributes 22 2 9% No
fatsheep9146 processor/k8sattributes 22 0 0% No
odubajDT processor/k8sattributes 11 6 55% No
TylerHelmuth processor/k8sattributes 22 0 0% No
Aneurysm9 processor/resourcedetection 48 0 0% No
dashpole processor/resourcedetection 61 25 41% No
Aneurysm9 processor/resourcedetection/internal/akamai 1 0 0% No
dashpole processor/resourcedetection/internal/akamai 2 1 50% No
dashpole processor/resourcedetection/internal/alibaba/ecs 2 0 0% No
Aneurysm9 processor/resourcedetection/internal/azure 2 0 0% No
dashpole processor/resourcedetection/internal/azure 4 1 25% No
dashpole processor/resourcedetection/internal/digitalocean 3 0 0% No
Aneurysm9 processor/resourcedetection/internal/hetzner 1 0 0% No
dashpole processor/resourcedetection/internal/hetzner 2 0 0% No
dashpole processor/resourcedetection/internal/oraclecloud 4 0 0% No
Aneurysm9 processor/resourcedetection/internal/scaleway 1 0 0% No
dashpole processor/resourcedetection/internal/scaleway 3 0 0% No
dashpole processor/resourcedetection/internal/upcloud 3 0 0% No
Aneurysm9 processor/resourcedetection/internal/vultr 1 0 0% No
dashpole processor/resourcedetection/internal/vultr 2 0 0% No
bogdandrutu processor/transform 6 0 0% No
edmocosta processor/transform 6 3 50% No
evan-bradley processor/transform 6 1 17% No
TylerHelmuth processor/transform 6 0 0% No
andrzej-stencel receiver/filelog 5 2 40% No
braydonk receiver/hostmetrics 4 0 0% No
dmitryax receiver/hostmetrics 5 2 40% No
rogercoll receiver/hostmetrics 3 2 67% No
Aneurysm9 receiver/prometheus 15 0 0% No
ArthurSens receiver/prometheus 13 3 23% No
dashpole receiver/prometheus 17 4 24% No
krajorama receiver/prometheus 15 3 20% No
PRs below threshold
Code owner Component Total Responded % Meets 80%?
bogdandrutu processor/filter 7 0 0% No
edmocosta processor/filter 6 1 17% No
evan-bradley processor/filter 7 2 29% No
TylerHelmuth processor/filter 7 0 0% No
ChrsMark processor/k8sattributes 17 12 71% No
dmitryax processor/k8sattributes 22 2 9% No
fatsheep9146 processor/k8sattributes 22 0 0% No
odubajDT processor/k8sattributes 11 6 55% No
TylerHelmuth processor/k8sattributes 22 0 0% No
Aneurysm9 processor/resourcedetection 48 0 0% No
dashpole processor/resourcedetection 61 25 41% No
Aneurysm9 processor/resourcedetection/internal/akamai 1 0 0% No
dashpole processor/resourcedetection/internal/akamai 2 1 50% No
dashpole processor/resourcedetection/internal/alibaba/ecs 2 0 0% No
Aneurysm9 processor/resourcedetection/internal/azure 2 0 0% No
dashpole processor/resourcedetection/internal/azure 4 1 25% No
dashpole processor/resourcedetection/internal/digitalocean 3 0 0% No
Aneurysm9 processor/resourcedetection/internal/hetzner 1 0 0% No
dashpole processor/resourcedetection/internal/hetzner 2 0 0% No
dashpole processor/resourcedetection/internal/oraclecloud 4 0 0% No
Aneurysm9 processor/resourcedetection/internal/scaleway 1 0 0% No
dashpole processor/resourcedetection/internal/scaleway 3 0 0% No
dashpole processor/resourcedetection/internal/upcloud 3 0 0% No
Aneurysm9 processor/resourcedetection/internal/vultr 1 0 0% No
dashpole processor/resourcedetection/internal/vultr 2 0 0% No
bogdandrutu processor/transform 6 0 0% No
edmocosta processor/transform 6 3 50% No
evan-bradley processor/transform 6 1 17% No
TylerHelmuth processor/transform 6 0 0% No
andrzej-stencel receiver/filelog 5 2 40% No
braydonk receiver/hostmetrics 4 0 0% No
dmitryax receiver/hostmetrics 5 2 40% No
rogercoll receiver/hostmetrics 3 2 67% No
Aneurysm9 receiver/prometheus 15 0 0% No
ArthurSens receiver/prometheus 13 3 23% No
dashpole receiver/prometheus 17 4 24% No
krajorama receiver/prometheus 15 3 20% No

@mx-psi
Copy link
Member

mx-psi commented Feb 12, 2026

@mx-psi here is an attempt to count reviews per codeowner of the specific components that are targeting stability.

Thanks for working on this!

I suggest that we focus on those only for now so as to avoid extra noise by checking the vast list of Contrib's components :).

Yeah that makes sense to me

I wonder if 80% target is quite high though specially when we timeframe in a monthly period. Happy to tune the targets/checks accordingly.

I agree it is quite high, we can start with something lower (maybe to start smaller we could do 50%). Also, the target was meant to be per component and not specifically per codeowner. We could lower the percentage do something like target%/num_of_codeowners (so, e.g., if we go with 50% and there are two codeowners, we check if each has replied to at least 25% of issues?)

Also I only have the report for PRs but we can expand to report issues' stats as well if we find this useful either now or enable it on a later iteration.

Let's start with PRs for now to keep this small and add issues later?

@ChrsMark
Copy link
Member Author

ChrsMark commented Feb 12, 2026

I agree it is quite high, we can start with something lower (maybe to start smaller we could do 50%). Also, the target was meant to be per component and not specifically per codeowner. We could lower the percentage do something like target%/num_of_codeowners (so, e.g., if we go with 50% and there are two codeowners, we check if each has replied to at least 25% of issues?)

We require at least 3 codeowners for components that aim to become stable, so maybe we can set the summary goal of the component to 75% and ask for 25% from each codeowner?

Otherwise we require that: 75% of PRs per component get reviewed at least by one code-owner and that codeowners contribute at least 75%/number_of_codeowners of reviews to the component.

Signed-off-by: ChrsMark <[email protected]>
@ChrsMark
Copy link
Member Author

New Sample output:

Code owner activity report

Period: 2026-01-13 – 2026-02-12

We target at least 75% of each component's PRs to be reviewed by a code owner, and each code owner to respond to at least 75% / n of their requested PRs (n = number of code owners for that component) (at least 3 code owners for components aiming for stable).

Components in scope: processor/filter, processor/k8sattributes, processor/resourcedetection, processor/transform, receiver/filelog, receiver/hostmetrics, receiver/prometheus (and processor/resourcedetection/* sub-labels).

Component PR review rate (75% target)

Component Code owners PRs reviewed % Meets 75%?
processor/filter 4 2/7 29% No
processor/k8sattributes 5 17/22 77% Yes
processor/resourcedetection 2 25/61 41% No
processor/resourcedetection/internal/akamai 2 1/2 50% No
processor/resourcedetection/internal/alibaba/ecs 1 0/2 0% No
processor/resourcedetection/internal/azure 2 1/4 25% No
processor/resourcedetection/internal/digitalocean 1 0/3 0% No
processor/resourcedetection/internal/hetzner 2 0/2 0% No
processor/resourcedetection/internal/oraclecloud 1 0/4 0% No
processor/resourcedetection/internal/scaleway 2 0/3 0% No
processor/resourcedetection/internal/upcloud 1 0/3 0% No
processor/resourcedetection/internal/vultr 2 0/2 0% No
processor/transform 4 3/6 50% No
receiver/filelog 1 2/5 40% No
receiver/hostmetrics 3 3/5 60% No
receiver/prometheus 4 9/17 53% No
PRs (per code owner)
Code owner Component Total Responded % Meets 75%/n?
bogdandrutu processor/filter 7 0 0% No
edmocosta processor/filter 6 1 17% No
evan-bradley processor/filter 7 2 29% Yes
TylerHelmuth processor/filter 7 0 0% No
ChrsMark processor/k8sattributes 17 12 71% Yes
dmitryax processor/k8sattributes 22 2 9% No
fatsheep9146 processor/k8sattributes 22 0 0% No
odubajDT processor/k8sattributes 11 6 55% Yes
TylerHelmuth processor/k8sattributes 22 0 0% No
Aneurysm9 processor/resourcedetection 48 0 0% No
dashpole processor/resourcedetection 61 25 41% Yes
Aneurysm9 processor/resourcedetection/internal/akamai 1 0 0% No
dashpole processor/resourcedetection/internal/akamai 2 1 50% Yes
dashpole processor/resourcedetection/internal/alibaba/ecs 2 0 0% No
Aneurysm9 processor/resourcedetection/internal/azure 2 0 0% No
dashpole processor/resourcedetection/internal/azure 4 1 25% No
dashpole processor/resourcedetection/internal/digitalocean 3 0 0% No
Aneurysm9 processor/resourcedetection/internal/hetzner 1 0 0% No
dashpole processor/resourcedetection/internal/hetzner 2 0 0% No
dashpole processor/resourcedetection/internal/oraclecloud 4 0 0% No
Aneurysm9 processor/resourcedetection/internal/scaleway 1 0 0% No
dashpole processor/resourcedetection/internal/scaleway 3 0 0% No
dashpole processor/resourcedetection/internal/upcloud 3 0 0% No
Aneurysm9 processor/resourcedetection/internal/vultr 1 0 0% No
dashpole processor/resourcedetection/internal/vultr 2 0 0% No
bogdandrutu processor/transform 6 0 0% No
edmocosta processor/transform 6 3 50% Yes
evan-bradley processor/transform 6 1 17% No
TylerHelmuth processor/transform 6 0 0% No
andrzej-stencel receiver/filelog 5 2 40% No
braydonk receiver/hostmetrics 4 0 0% No
dmitryax receiver/hostmetrics 5 2 40% Yes
rogercoll receiver/hostmetrics 3 2 67% Yes
Aneurysm9 receiver/prometheus 15 0 0% No
ArthurSens receiver/prometheus 13 3 23% Yes
dashpole receiver/prometheus 17 4 24% Yes
krajorama receiver/prometheus 15 3 20% Yes

Signed-off-by: ChrsMark <[email protected]>
@ArthurSens
Copy link
Member

Hmmm, I feel like we're trying to do two things at once here. Identify inactive codeowners and assess how responsive a codeowners group is to their components.

I'm looking at Prometheus receiver stats since that's where I keep a constant eye. If we look at Krajo, David, Anthony, and my responsiveness individually, none of us reaches the 80% threshold. In reality, if I see that other codeowners have already responded to an issue and I have nothing to add, I won't comment.

To get this right, I think we need to split the concerns here. Use something different to identify inactive individuals, count codeowners as a group of people, and check how responsive the whole group is together.

@ChrsMark
Copy link
Member Author

We don't target 80%, that was the initial plan :)
Latest state is the following:

We target at least 75% of each component's PRs to be reviewed by at least a code owner, and each code owner to respond to at least 75% / n of their requested PRs (n = number of code owners for that component) (at least 3 code owners for components aiming for stable).

See the sample output at #46015 (comment).

The idea here is that we first focus on the components (first table) ensuring that at least 75% of them are reviewed by at least one person. This ensures that people submitting PRs are getting reviews.

Then we have the additional table as a reference to drill down more if needed and check if something can be fixed for a specific component to improve its stats and "health". Imagine that a component has 70% of reviews which is only coming from one or two codeowners. Having a look into the secondary table will provide the insight that an active third codeowner is required.

Would that be reasonable @ArthurSens ?

@ArthurSens
Copy link
Member

Ah gotcha, I think I was misinterpreting the tables.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants