Skip to content

[DO NOT MERGE] Hygiene script#3327

Open
maryliag wants to merge 5 commits intoopen-telemetry:mainfrom
maryliag:cleanup-script
Open

[DO NOT MERGE] Hygiene script#3327
maryliag wants to merge 5 commits intoopen-telemetry:mainfrom
maryliag:cleanup-script

Conversation

@maryliag
Copy link
Contributor

@maryliag maryliag commented Mar 13, 2026

This is not the final script. This is analyzing which members are no longer active according to the rules, and then generating the final list. If for a particular repo, a user is part of multiple teams (x-triager, x-approver) this is listing them twice, so it's clear they should be removed from both.

There are a few repos excluded (since it doesn't make sense), similar to particular teams and repos combination.

The first comment will add the result of this script, this way I would like to get a review if there are any other specific exceptions that need to be added.

The next step is updating this script to generate a PR on each respective repo with the updates and create a workflow to execute this monthly.

For now, this is handling triagers, approvers and maintainers.

This script is based on the proposal found here: #3295

@maryliag
Copy link
Contributor Author

maryliag commented Mar 13, 2026

Results of the script: (latests itaration)

INACTIVE MEMBERS REPORT
(no activity since 2025-11-15)

open-telemetry/build-tools:

  • @Oberon00 (Approver, team: build-tools-approvers)

open-telemetry/govanityurls:

  • @damemi (Approver, team: go-instrumentation-approvers)
  • @damemi (Maintainer, team: go-instrumentation-maintainers)
  • @edeNFed (Approver, team: go-instrumentation-approvers)
  • @edeNFed (Maintainer, team: go-instrumentation-maintainers)
  • @fatsheep9146 (Approver, team: collector-contrib-approvers)

open-telemetry/opentelemetry-browser:

  • @tedsuo (Approver, team: browser-approvers)
  • @tedsuo (Maintainer, team: browser-maintainers)

open-telemetry/opentelemetry-collector:

open-telemetry/opentelemetry-collector-contrib:

open-telemetry/opentelemetry-collector-releases:

  • @dashpole (Approver, team: collector-releases-approvers)
  • @edmocosta (Approver, team: collector-releases-approvers)
  • @edmocosta (Maintainer, team: collector-releases-maintainers)
  • @fatsheep9146 (Approver, team: collector-contrib-approvers)
  • @fatsheep9146 (Approver, team: collector-releases-approvers)
  • @jackgopack4 (Approver, team: collector-releases-approvers)
  • @mwear (Approver, team: collector-releases-approvers)
  • @povilasv (Approver, team: helm-approvers)

open-telemetry/opentelemetry-cpp:

  • @esigo (Approver, team: cpp-approvers)
  • @esigo (Maintainer, team: cpp-maintainers)
  • @jsuereth (Approver, team: cpp-approvers)
  • @psx95 (Approver, team: cpp-approvers)

open-telemetry/opentelemetry-cpp-contrib:

  • @DebajitDas (Approver, team: cpp-contrib-approvers)
  • @TomRoSystems (Approver, team: cpp-contrib-approvers)
  • @aryanishan1001 (Approver, team: cpp-contrib-approvers)
  • @esigo (Approver, team: cpp-approvers)
  • @esigo (Approver, team: cpp-contrib-approvers)
  • @esigo (Maintainer, team: cpp-contrib-maintainers)
  • @esigo (Maintainer, team: cpp-maintainers)
  • @jsuereth (Approver, team: cpp-approvers)
  • @jsuereth (Approver, team: cpp-contrib-approvers)
  • @kpratyus (Approver, team: cpp-contrib-approvers)
  • @lalitb (Approver, team: cpp-contrib-approvers)
  • @lalitb (Maintainer, team: cpp-contrib-maintainers)
  • @maxgolov (Approver, team: cpp-contrib-approvers)
  • @psx95 (Approver, team: cpp-approvers)
  • @pyohannes (Approver, team: cpp-contrib-approvers)
  • @seemk (Approver, team: cpp-contrib-approvers)
  • @tobiasstadler (Approver, team: cpp-contrib-approvers)

open-telemetry/opentelemetry-dotnet-contrib:

open-telemetry/opentelemetry-ebpf-profiler:

  • @petethepig (Approver, team: ebpf-profiler-approvers)
  • @petethepig (Maintainer, team: ebpf-profiler-maintainers)

open-telemetry/opentelemetry-go-build-tools:

open-telemetry/opentelemetry-go-compile-instrumentation:

  • @RomainMuller (Approver, team: go-compile-instrumentation-approvers)
  • @RomainMuller (Maintainer, team: go-compile-instrumentation-maintainers)
  • @dineshg13 (Approver, team: go-compile-instrumentation-approvers)
  • @dineshg13 (Maintainer, team: go-compile-instrumentation-maintainers)
  • @dineshg13 (Triager, team: go-compile-instrumentation-triagers)
  • @eliottness (Approver, team: go-compile-instrumentation-approvers)
  • @eliottness (Triager, team: go-compile-instrumentation-triagers)

open-telemetry/opentelemetry-go-instrumentation:

  • @damemi (Approver, team: go-instrumentation-approvers)
  • @damemi (Maintainer, team: go-instrumentation-maintainers)
  • @edeNFed (Approver, team: go-instrumentation-approvers)
  • @edeNFed (Maintainer, team: go-instrumentation-maintainers)
  • @edeNFed (Triager, team: go-instrumentation-triagers)

open-telemetry/opentelemetry-helm-charts:

open-telemetry/opentelemetry-java:

open-telemetry/opentelemetry-java-examples:

open-telemetry/opentelemetry-js:

open-telemetry/opentelemetry-js-contrib:

  • @DylanRussell (Triager, team: javascript-contrib-triagers)
  • @MSNev (Triager, team: javascript-contrib-triagers)
  • @MikeGoldsmith (Triager, team: javascript-contrib-triagers)
  • @aabmass (Triager, team: javascript-contrib-triagers)
  • @abhee11 (Triager, team: javascript-contrib-triagers)
  • @dashpole (Triager, team: javascript-contrib-triagers)
  • @kirrg001 (Triager, team: javascript-contrib-triagers)
  • @mottibec (Triager, team: javascript-contrib-triagers)
  • @mwear (Triager, team: javascript-contrib-triagers)
  • @naseemkullah (Triager, team: javascript-contrib-triagers)
  • @pkanal (Triager, team: javascript-contrib-triagers)
  • @pkanal (Triager, team: javascript-triagers)
  • @psx95 (Triager, team: javascript-contrib-triagers)
  • @punya (Triager, team: javascript-contrib-triagers)
  • @svetlanabrennan (Approver, team: javascript-approvers)
  • @svetlanabrennan (Triager, team: javascript-contrib-triagers)
  • @trivikr (Triager, team: javascript-contrib-triagers)

open-telemetry/opentelemetry-operator:

open-telemetry/opentelemetry-php:

open-telemetry/opentelemetry-php-contrib:

open-telemetry/opentelemetry-php-distro:

  • @bobstrecansky (Approver, team: php-distro-approvers)
  • @bobstrecansky (Maintainer, team: php-distro-maintainers)
  • @brettmc (Approver, team: php-distro-approvers)
  • @brettmc (Maintainer, team: php-distro-maintainers)

open-telemetry/opentelemetry-php-instrumentation:

open-telemetry/opentelemetry-proto:

  • @Oberon00 (Approver, team: proto-approvers)
  • @Oberon00 (Triager, team: proto-triagers)
  • @carlosalberto (Approver, team: proto-approvers)
  • @carlosalberto (Maintainer, team: proto-maintainers)
  • @carlosalberto (Triager, team: proto-triagers)
  • @codeboten (Approver, team: proto-approvers)
  • @codeboten (Triager, team: proto-triagers)
  • @dashpole (Approver, team: proto-approvers)
  • @dashpole (Triager, team: proto-triagers)
  • @dyladan (Approver, team: proto-approvers)
  • @dyladan (Triager, team: proto-triagers)
  • @jpkrohling (Approver, team: proto-approvers)
  • @jpkrohling (Triager, team: proto-triagers)
  • @lzchen (Approver, team: proto-approvers)
  • @lzchen (Triager, team: proto-triagers)
  • @petethepig (Approver, team: proto-approvers)
  • @petethepig (Triager, team: proto-triagers)
  • @tedsuo (Approver, team: proto-approvers)
  • @tedsuo (Triager, team: proto-triagers)
  • @tsloughter (Approver, team: proto-approvers)
  • @tsloughter (Triager, team: proto-triagers)

open-telemetry/opentelemetry-proto-java:

open-telemetry/opentelemetry-python:

  • @owais (Approver, team: python-approvers)
  • @shalevr (Approver, team: python-approvers)

open-telemetry/opentelemetry-ruby:

  • @mwear (Approver, team: ruby-approvers)
  • @mwear (Maintainer, team: ruby-maintainers)
  • @plantfansam (Approver, team: ruby-approvers)
  • @robbkidd (Approver, team: ruby-approvers)

open-telemetry/opentelemetry-ruby-contrib:

  • @NathanielRN (Triager, team: ruby-contrib-triagers)
  • @ahayworth (Approver, team: ruby-contrib-approvers)
  • @ahayworth (Maintainer, team: ruby-contrib-maintainers)
  • @fbogsany (Approver, team: ruby-contrib-approvers)
  • @fbogsany (Maintainer, team: ruby-contrib-maintainers)
  • @fbogsany (Triager, team: ruby-contrib-triagers)
  • @indrekj (Triager, team: ruby-contrib-triagers)
  • @jj22ee (Triager, team: ruby-contrib-triagers)
  • @muripic (Triager, team: ruby-contrib-triagers)
  • @mwear (Approver, team: ruby-contrib-approvers)
  • @mwear (Maintainer, team: ruby-contrib-maintainers)
  • @mwear (Triager, team: ruby-contrib-triagers)
  • @mwear (Maintainer, team: ruby-maintainers)
  • @plantfansam (Approver, team: ruby-contrib-approvers)
  • @plantfansam (Maintainer, team: ruby-contrib-maintainers)
  • @simi (Approver, team: ruby-contrib-approvers)

open-telemetry/opentelemetry-rust:

  • @shaun-cox (Approver, team: rust-approvers)

open-telemetry/opentelemetry-rust-contrib:

  • @shaun-cox (Approver, team: rust-approvers)

open-telemetry/opentelemetry-specification:

  • @Oberon00 (Approver, team: specs-approvers)
  • @alolita (Triager, team: specs-triagers)
  • @lzchen (Approver, team: specs-approvers)
  • @lzchen (Triager, team: specs-triagers)
  • @petethepig (Approver, team: ebpf-profiler-approvers)

open-telemetry/opentelemetry-swift-core:

  • @alolita (Triager, team: swift-core-triagers)

open-telemetry/opentelemetry.io:

  • @SergeyKanzhelev (Approver, team: blog-approvers)

open-telemetry/otel-arrow:

  • @v0y4g3r (Approver, team: arrow-approvers)
  • @v0y4g3r (Triager, team: arrow-triagers)

open-telemetry/semantic-conventions:

  • @alexvanboxel (Approver, team: semconv-security-approvers)
  • @austinlparker (Approver, team: semconv-log-approvers)
  • @bryce-b (Approver, team: semconv-client-approvers)
  • @bryce-b (Approver, team: semconv-ios-approvers)
  • @bryce-b (Approver, team: semconv-mobile-approvers)
  • @carlosalberto (Approver, team: semconv-cicd-approvers)
  • @carlosalberto (Approver, team: semconv-messaging-approvers)
  • @dpauls (Approver, team: semconv-messaging-approvers)
  • @jcocchi (Approver, team: semconv-db-approvers)
  • @jhalliday (Approver, team: profiling-approvers)
  • @jhalliday (Maintainer, team: profiling-maintainers)
  • @jonatan-ivanov (Approver, team: semconv-jvm-approvers)
  • @nachoBonafonte (Approver, team: semconv-client-approvers)
  • @nachoBonafonte (Approver, team: semconv-ios-approvers)
  • @nachoBonafonte (Approver, team: semconv-mobile-approvers)
  • @petethepig (Approver, team: profiling-approvers)
  • @petethepig (Maintainer, team: profiling-maintainers)
  • @pkanal (Approver, team: semconv-browser-approvers)
  • @pkanal (Approver, team: semconv-client-approvers)
  • @reyang (Approver, team: semconv-security-approvers)
  • @sourabh1007 (Approver, team: semconv-db-approvers)
  • @trentm (Approver, team: semconv-genai-approvers)

open-telemetry/semantic-conventions-java:

open-telemetry/sig-profiling:

  • @jhalliday (Approver, team: profiling-approvers)
  • @jhalliday (Maintainer, team: profiling-maintainers)
  • @petethepig (Approver, team: profiling-approvers)
  • @petethepig (Maintainer, team: profiling-maintainers)

@maryliag
Copy link
Contributor Author

Besides the repo I've already excluded, I'm considering removing the following ones I would like a feedback to confirm if make sense:

  • opentelemetry-configuration (since the respective SIG is shutting down)
  • opentelemetry-network (doesn't seems to be an active repo anymore)
  • opentelemetry-proto*
  • opentelemetry-specification
  • semantic-conventions
  • sig-end-user

@jsuereth
Copy link
Contributor

For opentelemetry-proto and opentelemetry-specification, semantic-conventions - I think you may want to be categorizing the GROUP not the REPOSITORY for these maintainers/approver positions. E.g. @lquerel is able to approve things on Semantic Conventions in his role as a weaver maintainer. If you look at weaver repository activity, he is active, but hasn't needed to use this role in semantic-conventions.

I'd like to suggest evaluating activity for an individual within any repository their group is responsible, and then we can also evaluate, separately, aggregate activity for a group in a repository.

Regarding initial results though - this is good data to have. I have been putting off going to emiritus status for C++ and Java approver, but given the current intensity of semantic conventions work I just don't think I'll be able to contribute meaningfully there as an approver.

@marcalff
Copy link
Member

Besides the repo I've already excluded, I'm considering removing the following ones I would like a feedback to confirm if make sense:

* opentelemetry-configuration (since the respective SIG is shutting down)

Could you expand on this ?

Where does "the SIG is shutting down" comes from ?

@marcalff
Copy link
Member

open-telemetry/cpp-build-tools:

This repository is very low traffic, but is it not dead: it is stable, and deliverables there (docker images) are used daily.

Tooling very rarely needs to be adjusted, hence the lack of activity.

@maryliag
Copy link
Contributor Author

Besides the repo I've already excluded, I'm considering removing the following ones I would like a feedback to confirm if make sense:

* opentelemetry-configuration (since the respective SIG is shutting down)

Could you expand on this ?

Where does "the SIG is shutting down" comes from ?

From here: #3297

@maryliag
Copy link
Contributor Author

maryliag commented Mar 14, 2026

For opentelemetry-proto and opentelemetry-specification, semantic-conventions - I think you may want to be categorizing the GROUP not the REPOSITORY for these maintainers/approver positions. E.g. @lquerel is able to approve things on Semantic Conventions in his role as a weaver maintainer. If you look at weaver repository activity, he is active, but hasn't needed to use this role in semantic-conventions.

I'd like to suggest evaluating activity for an individual within any repository their group is responsible, and then we can also evaluate, separately, aggregate activity for a group in a repository.

That is what is doing already, so if a user is part of team X and that team has 5 repos to it, if they're active into any of those 5, they're consider active in general and I don't tag that into any of the 5 repos "assigned" to that team.

The example you provided, that user is not marked as active in the weaver repo as you mentioned. You can actually see that user got flagged as inactive into the 3 repos the team weaver-maintainers is responsible for: weaver, opentelemetry-weaver-examples and semantic-conventions, and that is why they're shown. I have testes use cases where someone is active in only one of the repos of that team, and is working as expected.

Regarding initial results though - this is good data to have. I have been putting off going to emiritus status for C++ and Java approver, but given the current intensity of semantic conventions work I just don't think I'll be able to contribute meaningfully there as an approver.

I'm glad this is already helping :D

@lmolkova
Copy link
Member

Thanks for the data, it's really useful!

A few questions:

  1. Low-activity repos in general (e.g. proto). There are probably two types of these:
    • project never completed and is not active anymore - we should probably use this data to shut it down
    • project is stable and does not need much changes (e.g. proto for signals except profiles). Some maintainers on these repos may go quiet for long period of time, but they should keep the status given their expertise.
  2. Continuing 1: Some of the projects won't have many maintainers left if inactive are removed and are neither 'dead' nor 'stable' (e.g. open-telemetry/opentelemetry-lambda) what do we do with them? Should we archive them?
  3. We might want to have some logic that does not run analysis on repos created after cut date. E.g. open-telemetry/opentelemetry-weaver-packages is brand new

@lalitb
Copy link
Member

lalitb commented Mar 14, 2026

Thanks for sharing the data, this is helpful.

For opentelemetry-cpp and opentelemetry-cpp-contrib, I’d prefer not to be moved to emeritus. My recent activity has been more focused on otel-arrow, so direct PR activity in these repos has been lower, but I still keep an eye on issues and PRs there.

I was also one of the early contributors to the C++ SIG and involved in the initial implementation of several signals, so I have historical context around parts of the implementation that can still be helpful when questions or design discussions come up.

We also actively use otel-cpp within Microsoft and plan to continue doing so, so it would be good for me to remain on the maintainer list for those repos.

@marcalff
Copy link
Member

The next step is updating this script to generate a PR on each respective repo with the updates and create a workflow to execute this monthly.

I have some questions on this.

Having a report to see activity in general and raise flags is one thing, and is good.

The question then is what to do with the results.

I am concerned with the workflow and how automated this will be, possibly locking everyone out of a given repository just because not much happens there.

Even if there is a workflow that files PR automatically, I assume maintainers will have the final decision on what to do, correct ?

@marcalff
Copy link
Member

marcalff commented Mar 14, 2026

A technical comment here:

When someone is part of x-maintainers and x-approvers, any activity such as:

  • commenting on issues
  • raising PRs
  • doing code reviews

will NOT count as maintainer activity, it will be reported as approver activity for code reviews, or not at all.

The only activity that will register as a maintainer task is to simply click on the merge button (and maybe make a release ?).

A workflow that starts to evict maintainers who otherwise participate in a repository, but just do not perform merges, is dangerous in my opinion, activity should be evaluated globally.

Edit: This is based on my understanding of github privileges and when the maintainer priviledge is checked, this is not based on the script logic to check maintainer activity.

@lalitb
Copy link
Member

lalitb commented Mar 14, 2026

One observation on the maintainer activity check in the script: it looks like the current logic requires authored PRs in addition to reviews/comments in order to consider a maintainer active.

That might be a bit strict. According to the maintainer role description, activity can also show up through reviewing proposals and PRs, contributing to discussions, helping with design direction, etc. In more mature or stable repositories, maintainers may stay active mostly through review and guidance rather than regularly authoring PRs.

So requiring authored PRs as a mandatory signal may undercount maintainers who are still actively involved in the project.

@jsuereth
Copy link
Contributor

For opentelemetry-proto and opentelemetry-specification, semantic-conventions - I think you may want to be categorizing the GROUP not the REPOSITORY for these maintainers/approver positions. E.g. @lquerel is able to approve things on Semantic Conventions in his role as a weaver maintainer. If you look at weaver repository activity, he is active, but hasn't needed to use this role in semantic-conventions.
I'd like to suggest evaluating activity for an individual within any repository their group is responsible, and then we can also evaluate, separately, aggregate activity for a group in a repository.

That is what is doing already, so if a user is part of team X and that team has 5 repos to it, if they're active into any of those 5, they're consider active in general and I don't tag that into any of the 5 repos "assigned" to that team.

The example you provided, that user is not marked as active in the weaver repo as you mentioned. You can actually see that user got flagged as inactive into the 3 repos the team weaver-maintainers is responsible for: weaver, opentelemetry-weaver-examples and semantic-conventions, and that is why they're shown. I have testes use cases where someone is active in only one of the repos of that team, and is working as expected.

I think maybe we should check the script? Laurent just helped review our release and a few other tidbits on friday, is active in our weekly SIG and I believe has reviewed PRs within the bounds of your script (past 2 weeks). I'm actually surprised to see his name on the list for weaver and its associated repositories then, apologies I missed it was also on the otel/weaver.

@maryliag
Copy link
Contributor Author

maryliag commented Mar 15, 2026

Thank you all for the comments!

First thing, this is a script based on the proposal displayed here. That is the issue that discuss what you need to do to be consider active in each role, but I also want to acknowledge that are case by case scenarios that need changes, this is why I created the example of a result and shared here, so we can analyze these cases and make the proper updates (to the proposal and/or script).

Now, let me answer the questions/comments:

From @lmolkova:

  • I agree that is a challenge, this is why I was considering adding proto to the list of repos to be ignored (similar do semantic conventions), since is hard to know when projects are active, and is expected to be lower activity. I think it would be too hard to keep track of active ones up to date, but something maintainers of that repo, or TC/GC should keep an eye maybe.
  • regarding what to do with not active repos, I think is becomes out of scope of this script. Still a problem (e.g. opentelemetry-network that doesn't have activity in months), but I don't know what to do about it at the moment. Probably a case by case that needs to be checked
  • Good idea about brand new repos, I'll make the update

From @lalitb:

  • This script is flagging you, showing an example of a result, this is not the final PR that would actually tag you into those repos to be moved, but even when that PR is open the decision is still up to the maintainers of those repos, that is not something that the script will force.
  • We want to show the reality of who is active into any repo, so if you're having a hard time contributing to a particular repo (which I want to make it clear, is something completely normal and happens), that should be a way to indicate that, so that the repo can promote people that will be able to spend more time on it. Also, you can still help out in the ways that you mentioned without being a maintainer, which is actually something we encourage, we want everybody helping out where they can :)
  • For maintainers having to open PRs, that was a feedback I received when gathering info for the proposal, about how could be confusing having a maintainer acting as an approver, and what besides approving should be required, so that was a suggestion. So far I didn't hear any push back in the proposal itself, so please add your comments that too, so we can discuss what could be a good middle ground :)

From @marcalff

  • The workflow is to run the script monthly, the script creates the PR. It's still up to the maintainers of each repo, if they want to make the change or not. Specially because the PR is only updating readme files, the maintainers still need to manually remove from the respective team.
  • My plan is also to add a warning to any PRs that if merged will make only 0 or 1 maintainers left, which is not something acceptable. So it indicates that the maintainer is not active, highlighting that the repo should try to promote more people
  • You can find the full proposal here, that explains how this is to help start conversations, but the decision is still up to maintainers, and how absences are also expected
  • The criteria of what is consider active for each role is listed in the proposal, because as you mentioned, the privilege is not exactly what we consider to be reality. The gist is triager (any of: commented on issues or prs, added/removed labels to issues, closed issues), approver (added comments or approved/reviewed a PR) and maintainer (open prs and review prs)

From @jsuereth

  • Looks like the last time they opened a PR in the weaver repo was in october, which is one of the requirements on the script to be considered an active maintainer (opening and reviewing PRs). If you believe opening PRs should not be consider a requirements for maintainers (similar to the items I replied above), please also add the comments in the proposal

Hope this info has helped! 😅

@maryliag
Copy link
Contributor Author

The first comment is updated to the latest result after script changes (ignoring new repos, and removing cpp-build-tools.

If there is an agreement, I can also add semantic-conventions, opentelemetry-specification and proto* to the ignores repos list

@maryliag
Copy link
Contributor Author

Updated both the script and the proposal, so the maintainer condition is now an OR and not an AND. Also updated the first comment with the latest results

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.

5 participants