Add community members page (#4970)
Signed-off-by: svrnm <neumanns@cisco.com> Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com>
This commit is contained in:
parent
2ef12796ed
commit
21ccf0a714
|
|
@ -9,6 +9,7 @@ import:
|
|||
caseSensitive: true
|
||||
ignorePaths:
|
||||
- '*.svg'
|
||||
- data/community/members.yaml
|
||||
- vendors.yaml
|
||||
- content/ja
|
||||
- content/zh
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
title: End-user resources
|
||||
linkTitle: End user
|
||||
description: Vendor-agnostic resources for OpenTelemetry users
|
||||
weight: 40
|
||||
---
|
||||
|
||||
Looking to connect with other OpenTelemetry end users in a vendor-agnostic
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
title: OpenTelemetry Marketing Guidelines for Contributing Organizations
|
||||
linkTitle: Marketing Guidelines
|
||||
cSpell:ignore: devstats
|
||||
weight: 999
|
||||
---
|
||||
|
||||
OpenTelemetry (aka OTel) is a collaboration among end-users, adjacent OSS
|
||||
|
|
|
|||
|
|
@ -0,0 +1,76 @@
|
|||
---
|
||||
title: Members of the OpenTelemetry Project
|
||||
linkTitle: Members
|
||||
weight: 30
|
||||
cSpell:ignore: subproject triagers
|
||||
---
|
||||
|
||||
The OpenTelemetry community consists of many individuals from different
|
||||
backgrounds, who help to accomplish the
|
||||
[vision and mission](/community/mission/) of the project.
|
||||
|
||||
Below you find all the established community members in their different roles
|
||||
for the project.
|
||||
|
||||
If you are a contributor to the OpenTelemetry project already, and not listed
|
||||
here, you either have not
|
||||
[set your membership to public](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-your-membership-in-organizations/publicizing-or-hiding-organization-membership),
|
||||
or you need to take a look in our
|
||||
[contributor guidelines](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md)
|
||||
on how you can start your contributor as a member, and move up the ladder, all
|
||||
the way to maintainer!
|
||||
|
||||
## Governance Committee
|
||||
|
||||
The Governance Committee (GC) is the governing body of the OpenTelemetry
|
||||
project. Members of the GC are
|
||||
[elected by the Members Of Standing in the OpenTelemetry community](https://github.com/open-telemetry/community/blob/main/governance-charter.md#elections)
|
||||
|
||||
{{% community/members-list "governance-committee" %}}
|
||||
|
||||
## Technical Committee
|
||||
|
||||
The Technical Committee (TC) is responsible for all technical development within
|
||||
the OpenTelemetry project.
|
||||
|
||||
{{% community/members-list "technical-committee" %}}
|
||||
|
||||
## Specification Sponsors
|
||||
|
||||
Specification sponsors are trusted collaborators of the technical committee, and
|
||||
work to review, approve, and sponsor
|
||||
[OpenTelemetry specification](https://opentelemetry.io/docs/specs/otel/) issues
|
||||
and PRs.
|
||||
|
||||
{{% community/members-list "spec-sponsors" %}}
|
||||
|
||||
## Maintainers
|
||||
|
||||
Maintainers are the technical authority for a subproject in the OpenTelemetry
|
||||
project. Maintainers set technical direction and make or approve design
|
||||
decisions for their subproject.
|
||||
|
||||
{{% community/members-list "maintainers" %}}
|
||||
|
||||
## Approvers
|
||||
|
||||
Code approvers are able to both review and approve code contributions, as well
|
||||
as help maintainers triage issues and do project management.
|
||||
|
||||
{{% community/members-list "approvers" %}}
|
||||
|
||||
## Triagers
|
||||
|
||||
Triagers assist the maintainers and approvers with project management and
|
||||
backlog organization. The specific workflows and triage requirements depend on
|
||||
the project, and are set by the project maintainers.
|
||||
|
||||
{{% community/members-list "triagers" %}}
|
||||
|
||||
## Members
|
||||
|
||||
Members are continuously active contributors in the community. They can have
|
||||
issues and PRs assigned to them. Members are expected to participate in SIG(s)
|
||||
and remain active contributors to the community.
|
||||
|
||||
{{% community/members-list "members" %}}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -12,8 +12,7 @@ const markdownFiles = [
|
|||
'!content-modules/**',
|
||||
'!examples/**',
|
||||
'!layouts/**',
|
||||
'!node_modules/**',
|
||||
'!scripts/registry-scanner/node_modules/**',
|
||||
'!**/node_modules/**',
|
||||
'!tools/examples/**',
|
||||
'!themes/**',
|
||||
'!tmp/**',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,83 @@
|
|||
{{ $data := $.Site.Data.community.members -}}
|
||||
{{ $key := .Get 0 -}}
|
||||
{{ $group := index $data $key -}}
|
||||
{{ $lastIndex := 0 }}
|
||||
|
||||
{{ $colors := dict
|
||||
"dotnet" "secondary"
|
||||
"dotnet-contrib" "success"
|
||||
"python" "danger"
|
||||
"python-contrib" "light"
|
||||
"sqlcommenter" "info"
|
||||
"erlang" "dark"
|
||||
"erlang-contrib" "secondary"
|
||||
"configuration" "success"
|
||||
"sig-developer-experience" "danger"
|
||||
"rust" "info"
|
||||
"dotnet-instrumentation" "dark"
|
||||
"specs-semconv" "secondary"
|
||||
"sig-security" "success"
|
||||
"collector-contrib" "danger"
|
||||
"collector" "light"
|
||||
"sig-contributor-experience" "info"
|
||||
"docs-pt" "dark"
|
||||
"helm" "secondary"
|
||||
"javascript" "success"
|
||||
"sandbox-web-js" "danger"
|
||||
"ruby" "light"
|
||||
"ruby-contrib" "info"
|
||||
"weaver" "dark"
|
||||
"java-instrumentation" "secondary"
|
||||
"java-contrib" "success"
|
||||
"java" "danger"
|
||||
"android" "light"
|
||||
"go" "info"
|
||||
"proto-go" "dark"
|
||||
"go-instrumentation" "secondary"
|
||||
"cpp" "success"
|
||||
"cpp-contrib" "danger"
|
||||
"docs-cn" "light"
|
||||
"php" "info"
|
||||
"swift" "dark"
|
||||
"docs" "secondary"
|
||||
"docs-zh" "success"
|
||||
"docs-ja" "danger"
|
||||
"docs-es" "light"
|
||||
"arrow" "info"
|
||||
"sig-end-user" "dark"
|
||||
"opamp-go" "secondary"
|
||||
"opamp-spec" "success"
|
||||
"opamp-java" "danger"
|
||||
"demo" "light"
|
||||
"operator" "info"
|
||||
"operator-ta" "dark"
|
||||
"lambda-extension" "secondary"
|
||||
"network" "success"
|
||||
"profiling" "danger"
|
||||
"ebpf-profiler" "light"
|
||||
"sig-mainframe" "info"
|
||||
"semconv-security" "dark"
|
||||
"semconv-jvm" "secondary"
|
||||
"semconv-system" "success"
|
||||
"semconv-mobile" "danger"
|
||||
"semconv-container" "light"
|
||||
"semconv-k8s" "info"
|
||||
"semconv-messaging" "dark"
|
||||
"semconv-db" "secondary"
|
||||
"semconv-llm" "success"
|
||||
"semconv-event" "danger"
|
||||
"semconv-cicd" "light"
|
||||
-}}
|
||||
|
||||
{{ $defaultColor := "primary" }}
|
||||
|
||||
{{ range sort $group "name" }}
|
||||
- [{{ .name }}]({{ .html_url }})
|
||||
{{- range .teams -}}
|
||||
{{- if hasSuffix . $key -}}
|
||||
{{- $sig := replace (replace . (printf "-%s" $key) "") "opentelemetry-" "" -}}
|
||||
{{- $color := default $defaultColor (index $colors $sig) -}}
|
||||
<span class="badge rounded-pill text-bg-{{ $color }}">{{ $sig -}}</span>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
.env
|
||||
output.*
|
||||
|
|
@ -0,0 +1,176 @@
|
|||
import { config } from 'dotenv';
|
||||
import { Octokit } from '@octokit/rest';
|
||||
import fs from 'fs';
|
||||
import yaml from 'js-yaml';
|
||||
|
||||
config(); // Load .env file contents into process.env
|
||||
|
||||
const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
|
||||
const org = 'open-telemetry';
|
||||
|
||||
const configParams = {
|
||||
terms: ['maintainers', 'approvers', 'triagers'],
|
||||
// Note that below is some custom code that will remove technical-committee members from spec-sponsors
|
||||
committees: ['governance-committee', 'technical-committee', 'spec-sponsors'],
|
||||
includePrivateMembersInGeneral: false,
|
||||
includePrivateMembersInGroups: true,
|
||||
createMembersList: true,
|
||||
};
|
||||
|
||||
const outputPath = process.argv[2] || 'output.yml';
|
||||
|
||||
async function getTeams() {
|
||||
const teams = await octokit.paginate(octokit.rest.teams.list, {
|
||||
org,
|
||||
per_page: 100,
|
||||
});
|
||||
return teams;
|
||||
}
|
||||
|
||||
async function getTeamMembers(team_slug) {
|
||||
const members = await octokit.paginate(octokit.rest.teams.listMembersInOrg, {
|
||||
org,
|
||||
team_slug,
|
||||
per_page: 100,
|
||||
});
|
||||
return members;
|
||||
}
|
||||
|
||||
async function getOrgMembers() {
|
||||
const members = await octokit.paginate(octokit.rest.orgs.listMembers, {
|
||||
org,
|
||||
per_page: 100,
|
||||
});
|
||||
return members;
|
||||
}
|
||||
|
||||
async function getPublicOrgMembers() {
|
||||
const publicMembers = await octokit.paginate(
|
||||
octokit.rest.orgs.listPublicMembers,
|
||||
{
|
||||
org,
|
||||
per_page: 100,
|
||||
},
|
||||
);
|
||||
return publicMembers;
|
||||
}
|
||||
|
||||
async function collectDetails() {
|
||||
const teams = await getTeams();
|
||||
const allMembers = await getOrgMembers();
|
||||
const publicMembers = await getPublicOrgMembers();
|
||||
const teamMembers = new Set();
|
||||
const memberDetails = {};
|
||||
|
||||
const result = {
|
||||
maintainers: [],
|
||||
approvers: [],
|
||||
triagers: [],
|
||||
};
|
||||
|
||||
const committees = {};
|
||||
|
||||
if (configParams.createMembersList) {
|
||||
result.members = [];
|
||||
}
|
||||
|
||||
for (const team of teams) {
|
||||
const members = await getTeamMembers(team.slug);
|
||||
const filteredMembers = configParams.includePrivateMembersInGroups
|
||||
? members
|
||||
: members.filter((member) =>
|
||||
publicMembers.some((pubMember) => pubMember.login === member.login),
|
||||
);
|
||||
|
||||
const teamName = team.name.toLowerCase();
|
||||
|
||||
// Check for committees
|
||||
for (const committee of configParams.committees) {
|
||||
if (teamName === committee) {
|
||||
if (!committees[committee]) {
|
||||
committees[committee] = [];
|
||||
}
|
||||
committees[committee].push(
|
||||
...filteredMembers.map((member) => ({
|
||||
name: member.login,
|
||||
html_url: member.html_url,
|
||||
avatar_url: member.avatar_url,
|
||||
})),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Collect members based on terms
|
||||
for (const term of configParams.terms) {
|
||||
if (teamName.includes(term)) {
|
||||
filteredMembers.forEach((member) => {
|
||||
teamMembers.add(member.login);
|
||||
if (!memberDetails[member.login]) {
|
||||
memberDetails[member.login] = {
|
||||
name: member.login,
|
||||
teams: [],
|
||||
html_url: member.html_url,
|
||||
avatar_url: member.avatar_url,
|
||||
};
|
||||
}
|
||||
memberDetails[member.login].teams.push(teamName);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Deduplicate and prioritize members
|
||||
const categorizedMembers = new Set();
|
||||
|
||||
for (const term of configParams.terms) {
|
||||
Object.values(memberDetails).forEach((member) => {
|
||||
if (
|
||||
member.teams.some((team) => team.includes(term)) &&
|
||||
!categorizedMembers.has(member.name)
|
||||
) {
|
||||
result[term].push(member);
|
||||
categorizedMembers.add(member.name);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Find members who are not in any team
|
||||
if (configParams.createMembersList) {
|
||||
result.members = allMembers
|
||||
.filter((member) => !teamMembers.has(member.login))
|
||||
.filter(
|
||||
(member) =>
|
||||
configParams.includePrivateMembersInGeneral ||
|
||||
publicMembers.some((pubMember) => pubMember.login === member.login),
|
||||
)
|
||||
.map((member) => ({
|
||||
name: member.login,
|
||||
html_url: member.html_url,
|
||||
avatar_url: member.avatar_url,
|
||||
}));
|
||||
}
|
||||
|
||||
// Remove technical-committee members from spec-sponsors
|
||||
if (committees['spec-sponsors'] && committees['technical-committee']) {
|
||||
committees['spec-sponsors'] = committees['spec-sponsors'].filter(
|
||||
(member) =>
|
||||
!committees['technical-committee'].some(
|
||||
(tcMember) => tcMember.name === member.name,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Sort committees to the top of the output
|
||||
const sortedResult = { ...committees, ...result };
|
||||
|
||||
// Convert result to a plain JSON object to avoid YAML anchors
|
||||
const plainResult = JSON.parse(JSON.stringify(sortedResult));
|
||||
|
||||
// Convert result to YAML and write to file
|
||||
const yamlResult = yaml.dump(plainResult, { lineWidth: -1 });
|
||||
fs.writeFileSync(outputPath, yamlResult, 'utf8');
|
||||
|
||||
console.log(`Output written to ${outputPath}`);
|
||||
}
|
||||
|
||||
collectDetails().catch(console.error);
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@octokit/rest": "^18.0.0",
|
||||
"dotenv": "^10.0.0",
|
||||
"js-yaml": "^4.1.0"
|
||||
}
|
||||
}
|
||||
2624
static/refcache.json
2624
static/refcache.json
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue