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
|
caseSensitive: true
|
||||||
ignorePaths:
|
ignorePaths:
|
||||||
- '*.svg'
|
- '*.svg'
|
||||||
|
- data/community/members.yaml
|
||||||
- vendors.yaml
|
- vendors.yaml
|
||||||
- content/ja
|
- content/ja
|
||||||
- content/zh
|
- content/zh
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
title: End-user resources
|
title: End-user resources
|
||||||
linkTitle: End user
|
linkTitle: End user
|
||||||
description: Vendor-agnostic resources for OpenTelemetry users
|
description: Vendor-agnostic resources for OpenTelemetry users
|
||||||
|
weight: 40
|
||||||
---
|
---
|
||||||
|
|
||||||
Looking to connect with other OpenTelemetry end users in a vendor-agnostic
|
Looking to connect with other OpenTelemetry end users in a vendor-agnostic
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
title: OpenTelemetry Marketing Guidelines for Contributing Organizations
|
title: OpenTelemetry Marketing Guidelines for Contributing Organizations
|
||||||
linkTitle: Marketing Guidelines
|
linkTitle: Marketing Guidelines
|
||||||
cSpell:ignore: devstats
|
cSpell:ignore: devstats
|
||||||
|
weight: 999
|
||||||
---
|
---
|
||||||
|
|
||||||
OpenTelemetry (aka OTel) is a collaboration among end-users, adjacent OSS
|
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/**',
|
'!content-modules/**',
|
||||||
'!examples/**',
|
'!examples/**',
|
||||||
'!layouts/**',
|
'!layouts/**',
|
||||||
'!node_modules/**',
|
'!**/node_modules/**',
|
||||||
'!scripts/registry-scanner/node_modules/**',
|
|
||||||
'!tools/examples/**',
|
'!tools/examples/**',
|
||||||
'!themes/**',
|
'!themes/**',
|
||||||
'!tmp/**',
|
'!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