blob: dc43226e62a0cc75b6ae0d9114d0f7b7e84894bc [file] [log] [blame]
# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Chromite/CrOS specific detectors."""
import datetime
import os
from pathlib import Path
from chromite.third_party.opentelemetry.sdk import resources
from chromite.lib import chroot_lib
from chromite.lib import cros_build_lib
from chromite.lib import git
from chromite.lib import path_util
from chromite.lib import workon_helper
class SDKSourceDetector(resources.ResourceDetector):
"""Capture SDK source state."""
def detect(self) -> resources.Resource:
resource = {}
checkout_info = path_util.DetermineCheckout()
resource["checkout_type"] = checkout_info.type.name
if (
checkout_info.type == path_util.CheckoutType.REPO
and checkout_info.root
):
repo = git.FindRepoDir(checkout_info.root)
manifest_repo = Path(repo) / "manifests" if repo else None
if manifest_repo and (manifest_repo / ".git").is_dir():
manifest_checkout = git.ManifestCheckout.Cached(
checkout_info.root
)
branch = manifest_checkout.manifest_branch or ""
commit = git.GetLastCommit(manifest_repo)
resource["manifest_branch"] = branch
resource[
"manifest_commit_date"
] = commit.commit_date.isoformat()
resource["manifest_change_id"] = commit.change_id
resource["manifest_commit_sha"] = commit.sha
resource[
"manifest_sync_date"
] = datetime.datetime.fromtimestamp(
os.path.getmtime(manifest_repo), tz=datetime.timezone.utc
).isoformat()
workon_atoms = workon_helper.ListAllWorkedOnAtoms()
if workon_atoms:
for board, atoms in workon_atoms.items():
resource[f"workon_{board}"] = atoms
resource["inside_sdk"] = cros_build_lib.IsInsideChroot()
if cros_build_lib.IsInsideChroot():
# Only fetch when inside the SDK since we don't know whether the
# chroot in the default location, or even initialized.
chroot = chroot_lib.Chroot()
resource["chroot_tarball_version"] = chroot.tarball_version
return resources.Resource(resource)
class DevelopmentDetector(resources.ResourceDetector):
"""Capture development related info."""
def __init__(
self,
*args,
force_dev: bool = False,
**kwargs,
) -> None:
super().__init__(*args, **kwargs)
self.force_dev = force_dev
def detect(self) -> resources.Resource:
resource = {
"development.ignore_span": (
self.force_dev
or os.environ.get("CHROMITE_TELEMETRY_IGNORE") == "1"
),
"development.tag": os.environ.get("CHROMITE_TELEMETRY_TAG", ""),
}
return resources.Resource(resource)
class UserDetector(resources.ResourceDetector):
"""Capture user information."""
def __init__(self, user_uuid: str = "") -> None:
super().__init__()
self.user_uuid = user_uuid
def detect(self) -> resources.Resource:
return resources.Resource({"user.uuid": self.user_uuid})