moto/tests/test_logs/test_logs_query/test_boto3.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

151 lines
4.3 KiB
Python
Raw Normal View History

import time
from datetime import timedelta, datetime
import boto3
import pytest
from botocore.exceptions import ClientError
from moto import mock_logs
from moto.core.utils import unix_time, unix_time_millis
@mock_logs
def test_start_query__unknown_log_group():
client = boto3.client("logs", "us-east-1")
log_group_name = "/aws/codebuild/lowercase-dev"
client.create_log_group(logGroupName=log_group_name)
response = client.start_query(
logGroupName=log_group_name,
startTime=int(time.time()),
endTime=int(time.time()) + 300,
queryString="test",
)
assert "queryId" in response
with pytest.raises(ClientError) as exc:
client.start_query(
logGroupName="/aws/codebuild/lowercase-dev-invalid",
startTime=int(time.time()),
endTime=int(time.time()) + 300,
queryString="test",
)
# then
exc_value = exc.value
assert "ResourceNotFoundException" in exc_value.response["Error"]["Code"]
assert (
exc_value.response["Error"]["Message"]
== "The specified log group does not exist"
)
@mock_logs
def test_get_query_results():
client = boto3.client("logs", "us-east-1")
log_group_name = "test"
log_stream_name = "stream"
client.create_log_group(logGroupName=log_group_name)
client.create_log_stream(logGroupName=log_group_name, logStreamName=log_stream_name)
data = [
(
int(unix_time_millis(datetime.utcnow() - timedelta(minutes=x))),
f"event nr {x}",
)
for x in range(5)
]
events = [{"timestamp": x, "message": y} for x, y in reversed(data)]
client.put_log_events(
logGroupName=log_group_name, logStreamName=log_stream_name, logEvents=events
)
query_id = client.start_query(
logGroupName="test",
startTime=int(unix_time(datetime.utcnow() - timedelta(minutes=10))),
endTime=int(unix_time(datetime.utcnow() + timedelta(minutes=10))),
queryString="fields @message",
)["queryId"]
resp = client.get_query_results(queryId=query_id)
assert resp["status"] == "Complete"
assert len(resp["results"]) == 5
fields = set([row["field"] for field in resp["results"] for row in field])
assert fields == {"@ptr", "@message"}
messages = [
row["value"]
for field in resp["results"]
for row in field
if row["field"] == "@message"
]
assert messages == [
"event nr 4",
"event nr 3",
"event nr 2",
"event nr 1",
"event nr 0",
]
# Only find events from last 2 minutes
query_id = client.start_query(
logGroupName="test",
startTime=int(unix_time(datetime.utcnow() - timedelta(minutes=2))),
endTime=int(unix_time(datetime.utcnow())),
queryString="fields @message",
)["queryId"]
resp = client.get_query_results(queryId=query_id)
assert len(resp["results"]) == 2
messages = [
row["value"]
for field in resp["results"]
for row in field
if row["field"] == "@message"
]
assert messages == ["event nr 2", "event nr 1"]
@mock_logs
def test_describe_completed_query():
client = boto3.client("logs", "us-east-1")
client.create_log_group(logGroupName="test")
query_id = client.start_query(
logGroupName="test",
startTime=int(unix_time(datetime.utcnow() + timedelta(minutes=10))),
endTime=int(unix_time(datetime.utcnow() + timedelta(minutes=10))),
queryString="fields @message",
)["queryId"]
queries = client.describe_queries(logGroupName="test")["queries"]
assert len(queries) == 1
assert queries[0]["queryId"] == query_id
assert queries[0]["queryString"] == "fields @message"
assert queries[0]["status"] == "Complete"
assert queries[0]["createTime"]
assert queries[0]["logGroupName"] == "test"
queries = client.describe_queries(logGroupName="test", status="Complete")["queries"]
assert len(queries) == 1
queries = client.describe_queries(logGroupName="test", status="Scheduled")[
"queries"
]
assert len(queries) == 0
@mock_logs
def test_describe_queries_on_log_group_without_any():
client = boto3.client("logs", "us-east-1")
client.create_log_group(logGroupName="test1")
assert client.describe_queries(logGroupName="test1")["queries"] == []