Skip to content

Commit

Permalink
feat: add support for GHA resource attributes
Browse files Browse the repository at this point in the history
Change-Id: Ia8791aa527ccc8e0420a86bb023bdf7ae43f5775
  • Loading branch information
jd committed Dec 17, 2024
1 parent adb179e commit 79d5daf
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
3 changes: 3 additions & 0 deletions pytest_mergify/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

from pytest_mergify import utils
import pytest_mergify.resources.ci as resources_ci
import pytest_mergify.resources.github_actions as resources_gha

import pytest_opentelemetry.instrumentation

Expand Down Expand Up @@ -75,9 +76,11 @@ def pytest_configure(self, config: _pytest.config.Config) -> None:
else:
return

resources_gha.GitHubActionsResourceDetector().detect()
resource = opentelemetry.sdk.resources.get_aggregated_resources(
[
resources_ci.CIResourceDetector(),
resources_gha.GitHubActionsResourceDetector(),
]
)

Expand Down
39 changes: 39 additions & 0 deletions pytest_mergify/resources/github_actions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import os

from opentelemetry.sdk.resources import Resource, ResourceDetector

from opentelemetry.semconv._incubating.attributes import cicd_attributes
from opentelemetry.semconv._incubating.attributes import vcs_attributes

from pytest_mergify import utils


class GitHubActionsResourceDetector(ResourceDetector):
"""Detects OpenTelemetry Resource attributes for GitHub Actions."""

OPENTELEMETRY_GHA_MAPPING = {
cicd_attributes.CICD_PIPELINE_NAME: "GITHUB_JOB",
cicd_attributes.CICD_PIPELINE_RUN_ID: "GITHUB_RUN_ID",
cicd_attributes.CICD_PIPELINE_TASK_NAME: "GITHUB_ACTION",
vcs_attributes.VCS_REF_HEAD_NAME: "GITHUB_REF_NAME",
vcs_attributes.VCS_REF_HEAD_TYPE: "GITHUB_REF_TYPE",
vcs_attributes.VCS_REF_BASE_NAME: "GITHUB_BASE_REF",
"vcs.repository.name": "GITHUB_REPOSITORY",
"vcs.repository.id": "GITHUB_REPOSITORY_ID",
}

def detect(self) -> Resource:
if utils.get_ci_provider() != "github_actions":
return Resource({})

attributes = {}

if "GITHUB_SERVER_URL" in os.environ and "GITHUB_REPOSITORY" in os.environ:
attributes[vcs_attributes.VCS_REPOSITORY_URL_FULL] = (
os.environ["GITHUB_SERVER_URL"] + os.environ["GITHUB_REPOSITORY"]
)

for attribute_name, envvar in self.OPENTELEMETRY_GHA_MAPPING.items():
attributes[attribute_name] = os.environ.get(envvar)

return Resource(attributes)
18 changes: 18 additions & 0 deletions tests/test_resources.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import pytest

import _pytest.pytester
import _pytest.config

Expand All @@ -12,3 +14,19 @@ def test_span_resources_attributes(
assert plugin.exporter is not None
spans = plugin.exporter.get_finished_spans()
assert spans[0].resource.attributes["cicd.provider.name"] == utils.get_ci_provider()


@pytest.mark.skipif(
utils.get_ci_provider() != "github_actions", reason="This test only supports GHA"
)
def test_span_github_actions(
pytestconfig: _pytest.config.Config,
) -> None:
plugin = pytestconfig.pluginmanager.get_plugin("PytestMergify")
assert plugin is not None
assert plugin.exporter is not None
spans = plugin.exporter.get_finished_spans()
assert (
spans[0].resource.attributes["vcs.repository.name"]
== "Mergifyio/pytest-mergify"
)

0 comments on commit 79d5daf

Please sign in to comment.