def test_logs_single_query_raises_no_timespan(): credential = _credential() client = LogsQueryClient(credential) query = """AppRequests | where TimeGenerated > ago(12h) | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId""" # returns LogsQueryResult with pytest.raises(TypeError): client.query(os.environ['LOG_WORKSPACE_ID'], query)
def test_logs_single_query_with_non_200(): credential = _credential() client = LogsQueryClient(credential) query = """AppInsights | where TimeGenerated > ago(12h)""" with pytest.raises(HttpResponseError) as e: client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=None) assert "SemanticError" in e.value.message
def test_query_no_duration(): credential = _credential() client = LogsQueryClient(credential) query = """AppRequests | where TimeGenerated > ago(12h) | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId""" def callback(request): dic = json.loads(request.http_request.body) assert dic.get('timespan') is None # returns LogsQueryResult client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=None)
def test_query_duration_only(): credential = _credential() client = LogsQueryClient(credential) query = "AppRequests | take 5" duration = timedelta(days=3) def callback(request): dic = json.loads(request.http_request.body) assert 'PT259200.0S' in dic.get('timespan') client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=duration, raw_request_hook=callback)
class LogsPerfTest(PerfStressTest): def __init__(self, arguments): super().__init__(arguments) # auth configuration self.workspace_id = self.get_from_env('LOG_WORKSPACE_ID') self.query = "AppRequests | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId" # Create clients self.logs_client = SyncLogsQueryClient( credential=SyncDefaultAzureCredential()) self.async_logs_client = AsyncLogsQueryClient( credential=AsyncDefaultAzureCredential()) async def close(self): """This is run after cleanup. Use this to close any open handles or clients. """ await self.async_logs_client.close() await super().close() def run_sync(self): """The synchronous perf test. Try to keep this minimal and focused. Using only a single client API. Avoid putting any ancilliary logic (e.g. generating UUIDs), and put this in the setup/init instead so that we're only measuring the client API call. """ start_time = datetime(2021, 7, 25, 0, 0, 0, tzinfo=timezone.utc) end_time = datetime(2021, 7, 26, 0, 0, 0, tzinfo=timezone.utc) self.logs_client.query(self.workspace_id, self.query, timespan=(start_time, end_time)) async def run_async(self): """The asynchronous perf test. Try to keep this minimal and focused. Using only a single client API. Avoid putting any ancilliary logic (e.g. generating UUIDs), and put this in the setup/init instead so that we're only measuring the client API call. """ start_time = datetime(2021, 7, 25, 0, 0, 0, tzinfo=timezone.utc) end_time = datetime(2021, 7, 26, 0, 0, 0, tzinfo=timezone.utc) await self.async_logs_client.query(self.workspace_id, self.query, timespan=(start_time, end_time))
def test_query_start_and_end_time(): credential = _credential() client = LogsQueryClient(credential) query = "AppRequests | take 5" end_time = datetime.now(UTC()) start_time = end_time - timedelta(days=3) def callback(request): dic = json.loads(request.http_request.body) assert dic.get('timespan') is not None client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=(start_time, end_time), raw_request_hook=callback)
def test_query_duration_and_end_time(): credential = _credential() client = LogsQueryClient(credential) query = "AppRequests | take 5" end_time = datetime.now(UTC()) duration = 'P3D' def callback(request): dic = json.loads(request.http_request.body) assert 'P3D/' in dic.get('timespan') client.query(os.environ['LOG_WORKSPACE_ID'], query, duration=duration, end_time=end_time, raw_request_hook=callback)
def test_logs_single_query_with_partial_success(): credential = _credential() client = LogsQueryClient(credential) query = "set truncationmaxrecords=1; union * | project TimeGenerated | take 10" response = client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=None) assert response is not None
def test_logs_server_timeout(): client = LogsQueryClient(_credential()) with pytest.raises(HttpResponseError) as e: response = client.query( os.environ['LOG_WORKSPACE_ID'], "range x from 1 to 10000000000 step 1 | count", server_timeout=1, ) assert e.message.contains('Gateway timeout')
def test_logs_auth(): credential = _credential() client = LogsQueryClient(credential) query = """AppRequests | where TimeGenerated > ago(12h) | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId""" # returns LogsQueryResults response = client.query(os.environ['LOG_WORKSPACE_ID'], query) assert response is not None assert response.tables is not None
def test_logs_single_query_with_render(): credential = _credential() client = LogsQueryClient(credential) query = """AppRequests""" # returns LogsQueryResult response = client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=None, include_visualization=True) assert response.visualization is not None
def test_logs_single_query_additional_workspaces(): credential = _credential() client = LogsQueryClient(credential) query = "union * | where TimeGenerated > ago(100d) | project TenantId | summarize count() by TenantId" # returns LogsQueryResult response = client.query( os.environ['LOG_WORKSPACE_ID'], query, timespan=None, additional_workspaces=[os.environ["SECONDARY_WORKSPACE_ID"]], ) assert response is not None assert len(response.tables[0].rows) == 2
def test_query_response_types(): credential = _credential() client = LogsQueryClient(credential) query = """AppRequests | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId, Success, ItemCount, DurationMs""" # returns LogsQueryResult result = client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=None) assert isinstance(result.tables[0].rows[0][0], datetime) # TimeGenerated generated is a datetime assert isinstance(result.tables[0].rows[0][1], six.string_types) # _ResourceId generated is a string assert isinstance(result.tables[0].rows[0][2], bool) # Success generated is a bool assert isinstance(result.tables[0].rows[0][3], int) # ItemCount generated is a int
# Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. import os import pandas as pd from azure.monitor.query import LogsQueryClient from azure.identity import DefaultAzureCredential credential = DefaultAzureCredential() client = LogsQueryClient(credential) response = client.query( os.environ['LOG_WORKSPACE_ID'], "range x from 1 to 10000000000 step 1 | count", server_timeout=1, ) try: table = response.tables[0] df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns]) print(df) except TypeError: print(response.error)
import os import pandas as pd from datetime import datetime from msrest.serialization import UTC from azure.monitor.query import LogsQueryClient from azure.identity import DefaultAzureCredential credential = DefaultAzureCredential() client = LogsQueryClient(credential) # Response time trend # request duration over the last 12 hours. query = "union * | where TimeGenerated > ago(100d) | project TenantId | summarize count() by TenantId" end_time = datetime.now(UTC()) # returns LogsQueryResult response = client.query( os.environ['LOG_WORKSPACE_ID'], query, additional_workspaces=[os.environ["SECONDARY_WORKSPACE_ID"]], ) try: table = response.tables[0] df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns]) print(df) except TypeError: print(response.error)
from datetime import datetime, timedelta from msrest.serialization import UTC from azure.monitor.query import LogsQueryClient from azure.identity import DefaultAzureCredential credential = DefaultAzureCredential() client = LogsQueryClient(credential) # Response time trend # request duration over the last 12 hours. query = """AppRequests | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId""" # returns LogsQueryResult response = client.query(os.environ['LOG_WORKSPACE_ID'], query, timespan=timedelta(days=1)) try: table = response.tables[0] df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns]) key_value = df.to_dict(orient='records') print(key_value) except TypeError: print(response.error) """ [ { 'TimeGenerated': '2021-07-21T04:40:00Z', '_ResourceId': '/subscriptions/faa080af....', 'avgRequestDuration': 19.7987
client_id=os.environ['AZURE_CLIENT_ID'], client_secret=os.environ['AZURE_CLIENT_SECRET'], tenant_id=os.environ['AZURE_TENANT_ID']) client = LogsQueryClient(credential) # Response time trend # request duration over the last 12 hours. query = """AppRequests | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId""" end_time = datetime.now(UTC()) # returns LogsQueryResults response = client.query(os.environ['LOG_WORKSPACE_ID'], query, duration='PT1H', end_time=end_time) if not response.tables: print("No results for the query") #response.tables is a LogsQueryResultTable for table in response.tables: for col in table.columns: #LogsQueryResultColumn print(col.name + "/" + col.type + " | ", end="") print("\n") for row in table.rows: for item in row: print(item + " | ", end="") print("\n") """
client_secret = os.environ['AZURE_CLIENT_SECRET'], tenant_id = os.environ['AZURE_TENANT_ID'] ) client = LogsQueryClient(credential) # [END client_auth_with_token_cred] # Response time trend # request duration over the last 12 hours. # [START send_logs_query] query = """AppRequests | where TimeGenerated > ago(12h) | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId""" # returns LogsQueryResults response = client.query(os.environ['LOG_WORKSPACE_ID'], query, start_time=datetime(2021, 6, 2), end_time=datetime.now()) if not response.tables: print("No results for the query") for table in response.tables: df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns]) print(df) # [END send_logs_query] """ TimeGenerated _ResourceId avgRequestDuration 0 2021-05-27T08:40:00Z /subscriptions/faa080af-c1d8-40ad-9cce-e1a450c... 27.307699999999997 1 2021-05-27T08:50:00Z /subscriptions/faa080af-c1d8-40ad-9cce-e1a450c... 18.11655 2 2021-05-27T09:00:00Z /subscriptions/faa080af-c1d8-40ad-9cce-e1a450c... 24.5271 """