Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ def get_service(self, service_id):
logger.error(f"Error getting service {service_id}: {e}")
raise Exception(f"Failed to get service: {e}")

def fetch_logs(self, service_id, start_time=None, end_time=None, limit=None):
def fetch_logs(self, service_id, start_time=None, end_time=None, limit=None,
instance=None, host=None, status_code=None, method=None,
task=None, task_run=None, level=None, type=None, text=None, path=None):
"""Fetch logs for a specific service."""
try:
# First, get the service details to extract the ownerId
Expand Down Expand Up @@ -110,6 +112,28 @@ def fetch_logs(self, service_id, start_time=None, end_time=None, limit=None):
if limit:
params['limit'] = limit

# Add filter parameters (arrays are passed as lists, requests handles them correctly)
if instance:
params['instance'] = instance if isinstance(instance, list) else [instance]
if host:
params['host'] = host if isinstance(host, list) else [host]
if status_code:
params['statusCode'] = status_code if isinstance(status_code, list) else [status_code]
if method:
params['method'] = method if isinstance(method, list) else [method]
if task:
params['task'] = task if isinstance(task, list) else [task]
if task_run:
params['taskRun'] = task_run if isinstance(task_run, list) else [task_run]
if level:
params['level'] = level if isinstance(level, list) else [level]
if type:
params['type'] = type if isinstance(type, list) else [type]
if text:
params['text'] = text if isinstance(text, list) else [text]
if path:
params['path'] = path if isinstance(path, list) else [path]

response = requests.get(url, headers=self.headers, params=params)
response.raise_for_status()
return response.json()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,70 @@ def __init__(self):
is_optional=True),
FormField(key_name=StringValue(value="limit"),
display_name=StringValue(value="Limit"),
description=StringValue(value='Maximum number of log entries to fetch (optional)'),
description=StringValue(value='Maximum number of log entries to fetch (1-100, optional, defaults to 20)'),
data_type=LiteralType.LONG,
form_field_type=FormFieldType.TEXT_FT,
is_optional=True),
FormField(key_name=StringValue(value="instance"),
display_name=StringValue(value="Instance"),
description=StringValue(value='Filter logs by instance ID(s) - array of strings'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="host"),
display_name=StringValue(value="Host"),
description=StringValue(value='Filter request logs by host - supports wildcards and regex'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="status_code"),
display_name=StringValue(value="Status Code"),
description=StringValue(value='Filter request logs by status code - supports wildcards and regex'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="method"),
display_name=StringValue(value="Method"),
description=StringValue(value='Filter request logs by HTTP method (GET, POST, etc.)'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="task"),
display_name=StringValue(value="Task"),
description=StringValue(value='Filter logs by task(s)'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="task_run"),
display_name=StringValue(value="Task Run"),
description=StringValue(value='Filter logs by task run ID(s)'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="level"),
display_name=StringValue(value="Level"),
description=StringValue(value='Filter logs by severity level - supports wildcards and regex'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="type"),
display_name=StringValue(value="Type"),
description=StringValue(value='Filter logs by type (app, request, build, etc.)'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="text"),
display_name=StringValue(value="Text"),
description=StringValue(value='Filter by log text content - supports wildcards and regex'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
FormField(key_name=StringValue(value="path"),
display_name=StringValue(value="Path"),
description=StringValue(value='Filter request logs by path - supports wildcards and regex'),
data_type=LiteralType.STRING,
form_field_type=FormFieldType.STRING_ARRAY_FT,
is_optional=True),
]
},
}
Expand Down Expand Up @@ -367,8 +427,24 @@ def fetch_logs(self, time_range: TimeRange, render_task: Render, connector_proto
end_time = task_data.end_time.value if task_data.end_time else None
limit = task_data.limit.value if task_data.limit else None

# Extract filter parameters (repeated string fields)
instance = list(task_data.instance) if task_data.instance else None
host = list(task_data.host) if task_data.host else None
status_code = list(task_data.status_code) if task_data.status_code else None
method = list(task_data.method) if task_data.method else None
task = list(task_data.task) if task_data.task else None
task_run = list(task_data.task_run) if task_data.task_run else None
level = list(task_data.level) if task_data.level else None
type = list(task_data.type) if task_data.type else None
text = list(task_data.text) if task_data.text else None
path = list(task_data.path) if task_data.path else None

api_processor = self._get_api_processor(connector_proto)
result = api_processor.fetch_logs(service_id, start_time, end_time, limit)
result = api_processor.fetch_logs(
service_id, start_time, end_time, limit,
instance=instance, host=host, status_code=status_code, method=method,
task=task, task_run=task_run, level=level, type=type, text=text, path=path
)

# Convert result to protobuf struct
result_struct = Struct()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@ message Render {
google.protobuf.StringValue start_time = 2;
google.protobuf.StringValue end_time = 3;
google.protobuf.Int64Value limit = 4;
repeated string instance = 5;
repeated string host = 6;
repeated string status_code = 7;
repeated string method = 8;
repeated string task = 9;
repeated string task_run = 10;
repeated string level = 11;
repeated string type = 12;
repeated string text = 13;
repeated string path = 14;
}

enum TaskType {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
isort:skip_file
"""
import builtins
import collections.abc
import google.protobuf.descriptor
import google.protobuf.internal.containers
import google.protobuf.internal.enum_type_wrapper
import google.protobuf.message
import google.protobuf.wrappers_pb2
Expand Down Expand Up @@ -114,6 +116,16 @@ class Render(google.protobuf.message.Message):
START_TIME_FIELD_NUMBER: builtins.int
END_TIME_FIELD_NUMBER: builtins.int
LIMIT_FIELD_NUMBER: builtins.int
INSTANCE_FIELD_NUMBER: builtins.int
HOST_FIELD_NUMBER: builtins.int
STATUS_CODE_FIELD_NUMBER: builtins.int
METHOD_FIELD_NUMBER: builtins.int
TASK_FIELD_NUMBER: builtins.int
TASK_RUN_FIELD_NUMBER: builtins.int
LEVEL_FIELD_NUMBER: builtins.int
TYPE_FIELD_NUMBER: builtins.int
TEXT_FIELD_NUMBER: builtins.int
PATH_FIELD_NUMBER: builtins.int
@property
def service_id(self) -> google.protobuf.wrappers_pb2.StringValue: ...
@property
Expand All @@ -122,16 +134,46 @@ class Render(google.protobuf.message.Message):
def end_time(self) -> google.protobuf.wrappers_pb2.StringValue: ...
@property
def limit(self) -> google.protobuf.wrappers_pb2.Int64Value: ...
@property
def instance(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def host(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def status_code(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def method(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def task(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def task_run(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def level(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def type(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def text(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
@property
def path(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
def __init__(
self,
*,
service_id: google.protobuf.wrappers_pb2.StringValue | None = ...,
start_time: google.protobuf.wrappers_pb2.StringValue | None = ...,
end_time: google.protobuf.wrappers_pb2.StringValue | None = ...,
limit: google.protobuf.wrappers_pb2.Int64Value | None = ...,
instance: collections.abc.Iterable[builtins.str] | None = ...,
host: collections.abc.Iterable[builtins.str] | None = ...,
status_code: collections.abc.Iterable[builtins.str] | None = ...,
method: collections.abc.Iterable[builtins.str] | None = ...,
task: collections.abc.Iterable[builtins.str] | None = ...,
task_run: collections.abc.Iterable[builtins.str] | None = ...,
level: collections.abc.Iterable[builtins.str] | None = ...,
type: collections.abc.Iterable[builtins.str] | None = ...,
text: collections.abc.Iterable[builtins.str] | None = ...,
path: collections.abc.Iterable[builtins.str] | None = ...,
) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["end_time", b"end_time", "limit", b"limit", "service_id", b"service_id", "start_time", b"start_time"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["end_time", b"end_time", "limit", b"limit", "service_id", b"service_id", "start_time", b"start_time"]) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["end_time", b"end_time", "host", b"host", "instance", b"instance", "level", b"level", "limit", b"limit", "method", b"method", "path", b"path", "service_id", b"service_id", "start_time", b"start_time", "status_code", b"status_code", "task", b"task", "task_run", b"task_run", "text", b"text", "type", b"type"]) -> None: ...

TYPE_FIELD_NUMBER: builtins.int
LIST_DEPLOYS_FIELD_NUMBER: builtins.int
Expand Down