Skip to content

Commit 96b6314

Browse files
authored
Change default local storage location (#26891)
1 parent 5f21d78 commit 96b6314

File tree

6 files changed

+27
-18
lines changed

6 files changed

+27
-18
lines changed

sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
### Breaking Changes
1111

12+
- Rename local storage configuration, change default path
13+
([#26891](https://github.com/Azure/azure-sdk-for-python/pull/26891))
14+
1215
### Bugs Fixed
1316

1417
- Fixed sampleRate field in ApplicationInsightsSampler, changed attribute to `_MS.sampleRate`

sdk/monitor/azure-monitor-opentelemetry-exporter/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ For more information about these resources, see [What is Azure Monitor?][product
133133
All configuration options can be passed through the constructors of exporters through `kwargs`. Below is a list of configurable options.
134134

135135
`connection_string`: The connection string used for your Application Insights resource.
136-
`enable_local_storage`: Boolean value to determine whether to store failed telemetry records for retry. Defaults to `True`.
137-
`storage_path`: Storage path in which to store retry files. Defaults to `<tempfile.gettempdir()>/opentelemetry-python-<your-instrumentation-key>`.
136+
`disable_offline_storage`: Boolean value to determine whether to disable storing failed telemetry records for retry. Defaults to `False`.
137+
`storage_directory`: Storage directory in which to store retry files. Defaults to `<tempfile.gettempdir()>/Microsoft/AzureMonitor/opentelemetry-python-<your-instrumentation-key>`.
138138

139139
## Examples
140140

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/_base.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
logger = logging.getLogger(__name__)
4141

42+
_AZURE_TEMPDIR_PREFIX = "Microsoft/AzureMonitor"
4243
_TEMPDIR_PREFIX = "opentelemetry-python-"
4344
_SERVICE_API_LATEST = "2020-09-15_Preview"
4445

@@ -59,25 +60,25 @@ def __init__(self, **kwargs: Any) -> None:
5960
6061
:keyword str api_version: The service API version used. Defaults to latest.
6162
:keyword str connection_string: The connection string used for your Application Insights resource.
62-
:keyword bool enable_local_storage: Determines whether to store failed telemetry records for retry. Defaults to `True`.
63-
:keyword str storage_path: Storage path in which to store retry files. Defaults to `<tempfile.gettempdir()>/opentelemetry-python-<your-instrumentation-key>`.
63+
:keyword bool disable_offline_storage: Determines whether to disable storing failed telemetry records for retry. Defaults to `False`.
64+
:keyword str storage_directory: Storage path in which to store retry files. Defaults to `<tempfile.gettempdir()>/opentelemetry-python-<your-instrumentation-key>`.
6465
:rtype: None
6566
"""
6667
parsed_connection_string = ConnectionStringParser(kwargs.get('connection_string'))
6768

6869
self._api_version = kwargs.get('api_version') or _SERVICE_API_LATEST
6970
self._consecutive_redirects = 0 # To prevent circular redirects
70-
self._enable_local_storage = kwargs.get('enable_local_storage', True)
71+
self._disable_offline_storage = kwargs.get('disable_offline_storage', False)
7172
self._endpoint = parsed_connection_string.endpoint
7273
self._instrumentation_key = parsed_connection_string.instrumentation_key
7374
self._storage_maintenance_period = kwargs.get('storage_maintenance_period', 60) # Maintenance interval in seconds.
7475
self._storage_max_size = kwargs.get('storage_max_size', 50 * 1024 * 1024) # Maximum size in bytes (default 50MiB)
7576
self._storage_min_retry_interval = kwargs.get('storage_min_retry_interval', 60) # minimum retry interval in seconds
7677
temp_suffix = self._instrumentation_key or ""
77-
default_storage_path = os.path.join(
78-
tempfile.gettempdir(), _TEMPDIR_PREFIX + temp_suffix
78+
default_storage_directory = os.path.join(
79+
tempfile.gettempdir(), _AZURE_TEMPDIR_PREFIX, _TEMPDIR_PREFIX + temp_suffix
7980
)
80-
self._storage_path = kwargs.get('storage_path', default_storage_path) # Storage path in which to store retry files.
81+
self._storage_directory = kwargs.get('storage_directory', default_storage_directory) # Storage path in which to store retry files.
8182
self._storage_retention_period = kwargs.get('storage_retention_period', 7 * 24 * 60 * 60) # Retention period in seconds
8283
self._timeout = kwargs.get('timeout', 10.0) # networking timeout in seconds
8384

@@ -101,9 +102,9 @@ def __init__(self, **kwargs: Any) -> None:
101102
self.client = AzureMonitorClient(
102103
host=self._endpoint, connection_timeout=self._timeout, policies=policies, **kwargs)
103104
self.storage = None
104-
if self._enable_local_storage:
105+
if not self._disable_offline_storage:
105106
self.storage = LocalFileStorage(
106-
path=self._storage_path,
107+
path=self._storage_directory,
107108
max_size=self._storage_max_size,
108109
maintenance_period=self._storage_maintenance_period,
109110
retention_period=self._storage_retention_period,
@@ -121,7 +122,7 @@ def _transmit_from_storage(self) -> None:
121122
# give a few more seconds for blob lease operation
122123
# to reduce the chance of race (for perf consideration)
123124
if blob.lease(self._timeout + 5):
124-
envelopes = [TelemetryItem(**x) for x in blob.get()]
125+
envelopes = [TelemetryItem.from_dict(x) for x in blob.get()]
125126
result = self._transmit(list(envelopes))
126127
if result == ExportResult.FAILED_RETRYABLE:
127128
blob.lease(1)

sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ $ python sample_requests.py
114114

115115
* Update `APPLICATIONINSIGHTS_CONNECTION_STRING` environment variable
116116

117-
* Ensure you have a database named `Database` with a table named `test`
117+
* Ensure you have a database named `test` with a table named `test_table`, make sure `test_table` has a field called `test_field`
118+
* Supply your `user` and `password` for your database if needed
118119
* Run the sample
119120

120121
```sh

sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/sample_psycopg2.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
)
3131
trace.get_tracer_provider().add_span_processor(span_processor)
3232

33-
cnx = psycopg2.connect(database='Database')
33+
cnx = psycopg2.connect(database='test', user="<user>", password="<password>")
3434
cursor = cnx.cursor()
35-
cursor.execute("INSERT INTO test (testField) VALUES (123)")
35+
cursor.execute("INSERT INTO test_tables (test_field) VALUES (123)")
3636
cursor.close()
3737
cnx.close()
3838

sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_base_exporter.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def test_constructor(self):
8484
storage_maintenance_period=30,
8585
storage_max_size=1000,
8686
storage_min_retry_interval=100,
87-
storage_path="test/path",
87+
storage_directory="test/path",
8888
storage_retention_period=2000,
8989
)
9090
self.assertEqual(
@@ -102,15 +102,17 @@ def test_constructor(self):
102102
self.assertEqual(base._timeout, 10)
103103
self.assertEqual(base._api_version, "2021-02-10_Preview")
104104
self.assertEqual(base._storage_min_retry_interval, 100)
105-
self.assertEqual(base._storage_path, "test/path")
105+
self.assertEqual(base._storage_directory, "test/path")
106106

107-
def test_transmit_from_storage_success(self):
107+
@mock.patch.object(TelemetryItem, "from_dict")
108+
def test_transmit_from_storage_success(self, dict_patch):
108109
exporter = BaseExporter()
109110
exporter.storage = mock.Mock()
110111
blob_mock = mock.Mock()
111112
blob_mock.lease.return_value = True
112113
envelope_mock = {"name":"test","time":"time"}
113114
blob_mock.get.return_value = [envelope_mock]
115+
dict_patch.return_value = {"name":"test","time":"time"}
114116
exporter.storage.gets.return_value = [blob_mock]
115117
with mock.patch.object(AzureMonitorClient, 'track') as post:
116118
post.return_value = TrackResponse(
@@ -123,13 +125,15 @@ def test_transmit_from_storage_success(self):
123125
blob_mock.lease.assert_called_once()
124126
blob_mock.delete.assert_called_once()
125127

126-
def test_transmit_from_storage_store_again(self):
128+
@mock.patch.object(TelemetryItem, "from_dict")
129+
def test_transmit_from_storage_store_again(self, dict_patch):
127130
exporter = BaseExporter()
128131
exporter.storage = mock.Mock()
129132
blob_mock = mock.Mock()
130133
blob_mock.lease.return_value = True
131134
envelope_mock = {"name":"test","time":"time"}
132135
blob_mock.get.return_value = [envelope_mock]
136+
dict_patch.return_value = {"name":"test","time":"time"}
133137
exporter.storage.gets.return_value = [blob_mock]
134138
with mock.patch("azure.monitor.opentelemetry.exporter.export._base._is_retryable_code"):
135139
with mock.patch.object(AzureMonitorClient, 'track', throw(HttpResponseError)):

0 commit comments

Comments
 (0)