Skip to content

Commit 9ba4820

Browse files
committed
Use object storage client for telemetry.
1 parent e366c28 commit 9ba4820

File tree

2 files changed

+34
-18
lines changed

2 files changed

+34
-18
lines changed

ads/telemetry/base.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
#!/usr/bin/env python
2-
# -*- coding: utf-8 -*-
32
# Copyright (c) 2024 Oracle and/or its affiliates.
43
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
54

65
import logging
76

8-
from ads import set_auth
7+
import oci
8+
99
from ads.common import oci_client as oc
10-
from ads.common.auth import default_signer
10+
from ads.common.auth import default_signer, resource_principal
1111
from ads.config import OCI_RESOURCE_PRINCIPAL_VERSION
1212

13-
1413
logger = logging.getLogger(__name__)
14+
15+
1516
class TelemetryBase:
1617
"""Base class for Telemetry Client."""
1718

@@ -25,15 +26,21 @@ def __init__(self, bucket: str, namespace: str = None) -> None:
2526
namespace : str, optional
2627
Namespace of the OCI object storage bucket, by default None.
2728
"""
29+
# Use resource principal as authentication method if available,
30+
# however, do not change the ADS authentication if user configured it by set_auth.
2831
if OCI_RESOURCE_PRINCIPAL_VERSION:
29-
set_auth("resource_principal")
30-
self._auth = default_signer()
31-
self.os_client = oc.OCIClientFactory(**self._auth).object_storage
32+
self._auth = resource_principal()
33+
else:
34+
self._auth = default_signer()
35+
self.os_client: oci.object_storage.ObjectStorageClient = oc.OCIClientFactory(
36+
**self._auth
37+
).object_storage
3238
self.bucket = bucket
3339
self._namespace = namespace
3440
self._service_endpoint = None
35-
logger.debug(f"Initialized Telemetry. Namespace: {self.namespace}, Bucket: {self.bucket}")
36-
41+
logger.debug(
42+
f"Initialized Telemetry. Namespace: {self.namespace}, Bucket: {self.bucket}"
43+
)
3744

3845
@property
3946
def namespace(self) -> str:
@@ -58,5 +65,5 @@ def service_endpoint(self):
5865
Tenancy-specific endpoint.
5966
"""
6067
if not self._service_endpoint:
61-
self._service_endpoint = self.os_client.base_client.endpoint
68+
self._service_endpoint = str(self.os_client.base_client.endpoint)
6269
return self._service_endpoint

ads/telemetry/client.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
#!/usr/bin/env python
2-
# -*- coding: utf-8 -*-
32
# Copyright (c) 2024 Oracle and/or its affiliates.
43
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
54

65

76
import logging
87
import threading
8+
import traceback
99
import urllib.parse
10-
import requests
10+
11+
import oci
1112
from requests import Response
12-
from .base import TelemetryBase
13+
1314
from ads.config import DEBUG_TELEMETRY
1415

16+
from .base import TelemetryBase
1517

1618
logger = logging.getLogger(__name__)
1719

@@ -32,7 +34,7 @@ class TelemetryClient(TelemetryBase):
3234
>>> import traceback
3335
>>> from ads.telemetry.client import TelemetryClient
3436
>>> AQUA_BUCKET = os.environ.get("AQUA_BUCKET", "service-managed-models")
35-
>>> AQUA_BUCKET_NS = os.environ.get("AQUA_BUCKET_NS", "ociodscdev")
37+
>>> AQUA_BUCKET_NS = os.environ.get("AQUA_BUCKET_NS", "namespace")
3638
>>> telemetry = TelemetryClient(bucket=AQUA_BUCKET, namespace=AQUA_BUCKET_NS)
3739
>>> telemetry.record_event_async(category="aqua/service/model", action="create") # records create action
3840
>>> telemetry.record_event_async(category="aqua/service/model/create", action="shape", detail="VM.GPU.A10.1")
@@ -69,16 +71,23 @@ def record_event(
6971
raise ValueError("Please specify the category and the action.")
7072
if detail:
7173
category, action = f"{category}/{action}", detail
74+
# Here `endpoint`` is for debugging purpose
75+
# For some federated/domain users, the `endpoint` may not be a valid URL
7276
endpoint = f"{self.service_endpoint}/n/{self.namespace}/b/{self.bucket}/o/telemetry/{category}/{action}"
73-
headers = {"User-Agent": self._encode_user_agent(**kwargs)}
7477
logger.debug(f"Sending telemetry to endpoint: {endpoint}")
75-
signer = self._auth["signer"]
76-
response = requests.head(endpoint, auth=signer, headers=headers)
77-
logger.debug(f"Telemetry status code: {response.status_code}")
78+
79+
self.os_client.base_client.user_agent = self._encode_user_agent(**kwargs)
80+
response: oci.response.Response = self.os_client.head_object(
81+
namespace_name=self.namespace,
82+
bucket_name=self.bucket,
83+
object_name=f"telemetry/{category}/{action}",
84+
)
85+
logger.debug(f"Telemetry status: {response.status}")
7886
return response
7987
except Exception as e:
8088
if DEBUG_TELEMETRY:
8189
logger.error(f"There is an error recording telemetry: {e}")
90+
traceback.print_exc()
8291

8392
def record_event_async(
8493
self, category: str = None, action: str = None, detail: str = None, **kwargs

0 commit comments

Comments
 (0)