holmesgpt 0.16.2a0__py3-none-any.whl → 0.18.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- holmes/__init__.py +3 -5
- holmes/clients/robusta_client.py +4 -3
- holmes/common/env_vars.py +18 -2
- holmes/common/openshift.py +1 -1
- holmes/config.py +11 -6
- holmes/core/conversations.py +30 -13
- holmes/core/investigation.py +21 -25
- holmes/core/investigation_structured_output.py +3 -3
- holmes/core/issue.py +1 -1
- holmes/core/llm.py +50 -31
- holmes/core/models.py +19 -17
- holmes/core/openai_formatting.py +1 -1
- holmes/core/prompt.py +47 -2
- holmes/core/runbooks.py +1 -0
- holmes/core/safeguards.py +4 -2
- holmes/core/supabase_dal.py +4 -2
- holmes/core/tool_calling_llm.py +102 -141
- holmes/core/tools.py +19 -28
- holmes/core/tools_utils/token_counting.py +9 -2
- holmes/core/tools_utils/tool_context_window_limiter.py +13 -30
- holmes/core/tools_utils/tool_executor.py +0 -18
- holmes/core/tools_utils/toolset_utils.py +1 -0
- holmes/core/toolset_manager.py +37 -2
- holmes/core/tracing.py +13 -2
- holmes/core/transformers/__init__.py +1 -1
- holmes/core/transformers/base.py +1 -0
- holmes/core/transformers/llm_summarize.py +3 -2
- holmes/core/transformers/registry.py +2 -1
- holmes/core/transformers/transformer.py +1 -0
- holmes/core/truncation/compaction.py +37 -2
- holmes/core/truncation/input_context_window_limiter.py +3 -2
- holmes/interactive.py +52 -8
- holmes/main.py +17 -37
- holmes/plugins/interfaces.py +2 -1
- holmes/plugins/prompts/__init__.py +2 -1
- holmes/plugins/prompts/_fetch_logs.jinja2 +5 -5
- holmes/plugins/prompts/_runbook_instructions.jinja2 +2 -1
- holmes/plugins/prompts/base_user_prompt.jinja2 +7 -0
- holmes/plugins/prompts/conversation_history_compaction.jinja2 +2 -1
- holmes/plugins/prompts/generic_ask.jinja2 +0 -2
- holmes/plugins/prompts/generic_ask_conversation.jinja2 +0 -2
- holmes/plugins/prompts/generic_ask_for_issue_conversation.jinja2 +0 -2
- holmes/plugins/prompts/generic_investigation.jinja2 +0 -2
- holmes/plugins/prompts/investigation_procedure.jinja2 +2 -1
- holmes/plugins/prompts/kubernetes_workload_ask.jinja2 +0 -2
- holmes/plugins/prompts/kubernetes_workload_chat.jinja2 +0 -2
- holmes/plugins/runbooks/__init__.py +32 -3
- holmes/plugins/sources/github/__init__.py +4 -2
- holmes/plugins/sources/prometheus/models.py +1 -0
- holmes/plugins/toolsets/__init__.py +30 -26
- holmes/plugins/toolsets/atlas_mongodb/mongodb_atlas.py +13 -12
- holmes/plugins/toolsets/azure_sql/apis/alert_monitoring_api.py +3 -2
- holmes/plugins/toolsets/azure_sql/apis/azure_sql_api.py +2 -1
- holmes/plugins/toolsets/azure_sql/apis/connection_failure_api.py +3 -2
- holmes/plugins/toolsets/azure_sql/apis/connection_monitoring_api.py +3 -1
- holmes/plugins/toolsets/azure_sql/apis/storage_analysis_api.py +3 -1
- holmes/plugins/toolsets/azure_sql/azure_sql_toolset.py +12 -12
- holmes/plugins/toolsets/azure_sql/tools/analyze_connection_failures.py +7 -7
- holmes/plugins/toolsets/azure_sql/tools/analyze_database_connections.py +7 -7
- holmes/plugins/toolsets/azure_sql/tools/analyze_database_health_status.py +3 -5
- holmes/plugins/toolsets/azure_sql/tools/analyze_database_performance.py +3 -3
- holmes/plugins/toolsets/azure_sql/tools/analyze_database_storage.py +7 -7
- holmes/plugins/toolsets/azure_sql/tools/get_active_alerts.py +6 -8
- holmes/plugins/toolsets/azure_sql/tools/get_slow_queries.py +3 -3
- holmes/plugins/toolsets/azure_sql/tools/get_top_cpu_queries.py +3 -3
- holmes/plugins/toolsets/azure_sql/tools/get_top_data_io_queries.py +3 -3
- holmes/plugins/toolsets/azure_sql/tools/get_top_log_io_queries.py +3 -3
- holmes/plugins/toolsets/azure_sql/utils.py +0 -32
- holmes/plugins/toolsets/bash/argocd/__init__.py +3 -3
- holmes/plugins/toolsets/bash/aws/__init__.py +4 -4
- holmes/plugins/toolsets/bash/azure/__init__.py +4 -4
- holmes/plugins/toolsets/bash/bash_toolset.py +2 -3
- holmes/plugins/toolsets/bash/common/bash.py +19 -9
- holmes/plugins/toolsets/bash/common/bash_command.py +1 -1
- holmes/plugins/toolsets/bash/common/stringify.py +1 -1
- holmes/plugins/toolsets/bash/kubectl/__init__.py +2 -1
- holmes/plugins/toolsets/bash/kubectl/constants.py +0 -1
- holmes/plugins/toolsets/bash/kubectl/kubectl_get.py +3 -4
- holmes/plugins/toolsets/bash/parse_command.py +12 -13
- holmes/plugins/toolsets/connectivity_check.py +124 -0
- holmes/plugins/toolsets/coralogix/api.py +132 -119
- holmes/plugins/toolsets/coralogix/coralogix.jinja2 +14 -0
- holmes/plugins/toolsets/coralogix/toolset_coralogix.py +219 -0
- holmes/plugins/toolsets/coralogix/utils.py +15 -79
- holmes/plugins/toolsets/datadog/datadog_api.py +36 -3
- holmes/plugins/toolsets/datadog/datadog_logs_instructions.jinja2 +34 -1
- holmes/plugins/toolsets/datadog/datadog_metrics_instructions.jinja2 +3 -3
- holmes/plugins/toolsets/datadog/datadog_models.py +59 -0
- holmes/plugins/toolsets/datadog/datadog_url_utils.py +213 -0
- holmes/plugins/toolsets/datadog/instructions_datadog_traces.jinja2 +165 -28
- holmes/plugins/toolsets/datadog/toolset_datadog_general.py +71 -28
- holmes/plugins/toolsets/datadog/toolset_datadog_logs.py +224 -375
- holmes/plugins/toolsets/datadog/toolset_datadog_metrics.py +67 -36
- holmes/plugins/toolsets/datadog/toolset_datadog_traces.py +360 -343
- holmes/plugins/toolsets/elasticsearch/__init__.py +6 -0
- holmes/plugins/toolsets/elasticsearch/elasticsearch.py +834 -0
- holmes/plugins/toolsets/git.py +7 -8
- holmes/plugins/toolsets/grafana/base_grafana_toolset.py +16 -4
- holmes/plugins/toolsets/grafana/common.py +2 -30
- holmes/plugins/toolsets/grafana/grafana_tempo_api.py +2 -1
- holmes/plugins/toolsets/grafana/loki/instructions.jinja2 +18 -2
- holmes/plugins/toolsets/grafana/loki/toolset_grafana_loki.py +92 -18
- holmes/plugins/toolsets/grafana/loki_api.py +4 -0
- holmes/plugins/toolsets/grafana/toolset_grafana.py +109 -25
- holmes/plugins/toolsets/grafana/toolset_grafana_dashboard.jinja2 +22 -0
- holmes/plugins/toolsets/grafana/toolset_grafana_tempo.py +201 -33
- holmes/plugins/toolsets/grafana/trace_parser.py +3 -2
- holmes/plugins/toolsets/internet/internet.py +10 -10
- holmes/plugins/toolsets/internet/notion.py +5 -6
- holmes/plugins/toolsets/investigator/core_investigation.py +3 -3
- holmes/plugins/toolsets/investigator/model.py +3 -1
- holmes/plugins/toolsets/json_filter_mixin.py +134 -0
- holmes/plugins/toolsets/kafka.py +12 -7
- holmes/plugins/toolsets/kubernetes.yaml +260 -30
- holmes/plugins/toolsets/kubernetes_logs.py +3 -3
- holmes/plugins/toolsets/logging_utils/logging_api.py +16 -6
- holmes/plugins/toolsets/mcp/toolset_mcp.py +88 -60
- holmes/plugins/toolsets/newrelic/new_relic_api.py +41 -1
- holmes/plugins/toolsets/newrelic/newrelic.jinja2 +24 -0
- holmes/plugins/toolsets/newrelic/newrelic.py +212 -55
- holmes/plugins/toolsets/prometheus/prometheus.py +358 -102
- holmes/plugins/toolsets/prometheus/prometheus_instructions.jinja2 +11 -3
- holmes/plugins/toolsets/rabbitmq/api.py +23 -4
- holmes/plugins/toolsets/rabbitmq/toolset_rabbitmq.py +5 -5
- holmes/plugins/toolsets/robusta/robusta.py +5 -5
- holmes/plugins/toolsets/runbook/runbook_fetcher.py +25 -6
- holmes/plugins/toolsets/servicenow_tables/servicenow_tables.py +1 -1
- holmes/plugins/toolsets/utils.py +1 -1
- holmes/utils/config_utils.py +1 -1
- holmes/utils/connection_utils.py +31 -0
- holmes/utils/console/result.py +10 -0
- holmes/utils/file_utils.py +2 -1
- holmes/utils/global_instructions.py +10 -26
- holmes/utils/holmes_status.py +4 -3
- holmes/utils/log.py +15 -0
- holmes/utils/markdown_utils.py +2 -3
- holmes/utils/memory_limit.py +58 -0
- holmes/utils/sentry_helper.py +23 -0
- holmes/utils/stream.py +12 -5
- holmes/utils/tags.py +4 -3
- holmes/version.py +3 -1
- {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/METADATA +12 -10
- holmesgpt-0.18.4.dist-info/RECORD +258 -0
- holmes/plugins/toolsets/aws.yaml +0 -80
- holmes/plugins/toolsets/coralogix/toolset_coralogix_logs.py +0 -114
- holmes/plugins/toolsets/datadog/datadog_traces_formatter.py +0 -310
- holmes/plugins/toolsets/datadog/toolset_datadog_rds.py +0 -736
- holmes/plugins/toolsets/grafana/grafana_api.py +0 -64
- holmes/plugins/toolsets/opensearch/__init__.py +0 -0
- holmes/plugins/toolsets/opensearch/opensearch.py +0 -250
- holmes/plugins/toolsets/opensearch/opensearch_logs.py +0 -161
- holmes/plugins/toolsets/opensearch/opensearch_traces.py +0 -215
- holmes/plugins/toolsets/opensearch/opensearch_traces_instructions.jinja2 +0 -12
- holmes/plugins/toolsets/opensearch/opensearch_utils.py +0 -166
- holmes/utils/keygen_utils.py +0 -6
- holmesgpt-0.16.2a0.dist-info/RECORD +0 -258
- holmes/plugins/toolsets/{opensearch → elasticsearch}/opensearch_ppl_query_docs.jinja2 +0 -0
- holmes/plugins/toolsets/{opensearch → elasticsearch}/opensearch_query_assist.py +2 -2
- /holmes/plugins/toolsets/{opensearch → elasticsearch}/opensearch_query_assist_instructions.jinja2 +0 -0
- {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/LICENSE +0 -0
- {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/WHEEL +0 -0
- {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/entry_points.txt +0 -0
|
@@ -1,27 +1,40 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
-
from
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Any, Dict, Optional, Tuple
|
|
6
|
+
|
|
7
|
+
from pydantic import AnyUrl
|
|
8
|
+
|
|
5
9
|
from holmes.core.tools import (
|
|
6
10
|
CallablePrerequisite,
|
|
7
11
|
StructuredToolResult,
|
|
12
|
+
StructuredToolResultStatus,
|
|
8
13
|
Tool,
|
|
9
14
|
ToolInvokeContext,
|
|
10
15
|
ToolParameter,
|
|
11
|
-
StructuredToolResultStatus,
|
|
12
16
|
Toolset,
|
|
13
17
|
ToolsetTag,
|
|
14
18
|
)
|
|
15
19
|
from holmes.plugins.toolsets.consts import (
|
|
16
|
-
TOOLSET_CONFIG_MISSING_ERROR,
|
|
17
20
|
STANDARD_END_DATETIME_TOOL_PARAM_DESCRIPTION,
|
|
21
|
+
TOOLSET_CONFIG_MISSING_ERROR,
|
|
18
22
|
)
|
|
19
23
|
from holmes.plugins.toolsets.datadog.datadog_api import (
|
|
20
|
-
|
|
24
|
+
MAX_RETRY_COUNT_ON_RATE_LIMIT,
|
|
21
25
|
DataDogRequestError,
|
|
22
26
|
execute_datadog_http_request,
|
|
23
27
|
get_headers,
|
|
24
|
-
|
|
28
|
+
)
|
|
29
|
+
from holmes.plugins.toolsets.datadog.datadog_models import DatadogMetricsConfig
|
|
30
|
+
from holmes.plugins.toolsets.datadog.datadog_url_utils import (
|
|
31
|
+
generate_datadog_metric_metadata_url,
|
|
32
|
+
generate_datadog_metric_tags_url,
|
|
33
|
+
generate_datadog_metrics_explorer_url,
|
|
34
|
+
generate_datadog_metrics_list_url,
|
|
35
|
+
)
|
|
36
|
+
from holmes.plugins.toolsets.logging_utils.logging_api import (
|
|
37
|
+
DEFAULT_TIME_SPAN_SECONDS,
|
|
25
38
|
)
|
|
26
39
|
from holmes.plugins.toolsets.utils import (
|
|
27
40
|
get_param_or_raise,
|
|
@@ -29,18 +42,6 @@ from holmes.plugins.toolsets.utils import (
|
|
|
29
42
|
standard_start_datetime_tool_param_description,
|
|
30
43
|
toolset_name_for_one_liner,
|
|
31
44
|
)
|
|
32
|
-
from holmes.plugins.toolsets.logging_utils.logging_api import (
|
|
33
|
-
DEFAULT_TIME_SPAN_SECONDS,
|
|
34
|
-
DEFAULT_LOG_LIMIT,
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
from datetime import datetime
|
|
38
|
-
|
|
39
|
-
from holmes.utils.keygen_utils import generate_random_key
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class DatadogMetricsConfig(DatadogBaseConfig):
|
|
43
|
-
default_limit: int = DEFAULT_LOG_LIMIT
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
class BaseDatadogMetricsTool(Tool):
|
|
@@ -131,10 +132,18 @@ class ListActiveMetrics(BaseDatadogMetricsTool):
|
|
|
131
132
|
for metric in sorted(metrics):
|
|
132
133
|
output.append(metric)
|
|
133
134
|
|
|
135
|
+
url = generate_datadog_metrics_list_url(
|
|
136
|
+
self.toolset.dd_config,
|
|
137
|
+
from_time,
|
|
138
|
+
params.get("host"),
|
|
139
|
+
params.get("tag_filter"),
|
|
140
|
+
)
|
|
141
|
+
|
|
134
142
|
return StructuredToolResult(
|
|
135
143
|
status=StructuredToolResultStatus.SUCCESS,
|
|
136
144
|
data="\n".join(output),
|
|
137
145
|
params=params,
|
|
146
|
+
url=url,
|
|
138
147
|
)
|
|
139
148
|
|
|
140
149
|
except DataDogRequestError as e:
|
|
@@ -341,7 +350,6 @@ class QueryMetrics(BaseDatadogMetricsTool):
|
|
|
341
350
|
response_data = {
|
|
342
351
|
"status": "success",
|
|
343
352
|
"error_message": None,
|
|
344
|
-
"random_key": generate_random_key(),
|
|
345
353
|
"tool_name": self.name,
|
|
346
354
|
"description": description,
|
|
347
355
|
"query": query,
|
|
@@ -352,11 +360,18 @@ class QueryMetrics(BaseDatadogMetricsTool):
|
|
|
352
360
|
"data": {"resultType": "matrix", "result": prometheus_result},
|
|
353
361
|
}
|
|
354
362
|
|
|
355
|
-
|
|
363
|
+
url = generate_datadog_metrics_explorer_url(
|
|
364
|
+
self.toolset.dd_config,
|
|
365
|
+
query,
|
|
366
|
+
from_time,
|
|
367
|
+
to_time,
|
|
368
|
+
)
|
|
369
|
+
|
|
356
370
|
return StructuredToolResult(
|
|
357
371
|
status=StructuredToolResultStatus.SUCCESS,
|
|
358
|
-
data=
|
|
372
|
+
data=response_data,
|
|
359
373
|
params=params,
|
|
374
|
+
url=url,
|
|
360
375
|
)
|
|
361
376
|
|
|
362
377
|
except DataDogRequestError as e:
|
|
@@ -461,10 +476,10 @@ class QueryMetricsMetadata(BaseDatadogMetricsTool):
|
|
|
461
476
|
|
|
462
477
|
for metric_name in metric_names:
|
|
463
478
|
try:
|
|
464
|
-
|
|
479
|
+
api_url = f"{self.toolset.dd_config.site_api_url}/api/v1/metrics/{metric_name}"
|
|
465
480
|
|
|
466
481
|
data = execute_datadog_http_request(
|
|
467
|
-
url=
|
|
482
|
+
url=api_url,
|
|
468
483
|
headers=headers,
|
|
469
484
|
payload_or_params={},
|
|
470
485
|
timeout=self.toolset.dd_config.request_timeout,
|
|
@@ -493,18 +508,29 @@ class QueryMetricsMetadata(BaseDatadogMetricsTool):
|
|
|
493
508
|
"failed": len(errors),
|
|
494
509
|
}
|
|
495
510
|
|
|
511
|
+
# Generate URL for the first metric (or a general metrics page if multiple)
|
|
512
|
+
if metric_names:
|
|
513
|
+
url = generate_datadog_metric_metadata_url(
|
|
514
|
+
self.toolset.dd_config,
|
|
515
|
+
metric_names[0],
|
|
516
|
+
)
|
|
517
|
+
else:
|
|
518
|
+
url = None
|
|
519
|
+
|
|
496
520
|
if not results and errors:
|
|
497
521
|
return StructuredToolResult(
|
|
498
522
|
status=StructuredToolResultStatus.ERROR,
|
|
499
523
|
error="Failed to retrieve metadata for all metrics",
|
|
500
|
-
data=
|
|
524
|
+
data=response_data,
|
|
501
525
|
params=params,
|
|
526
|
+
url=url,
|
|
502
527
|
)
|
|
503
528
|
|
|
504
529
|
return StructuredToolResult(
|
|
505
530
|
status=StructuredToolResultStatus.SUCCESS,
|
|
506
|
-
data=
|
|
531
|
+
data=response_data,
|
|
507
532
|
params=params,
|
|
533
|
+
url=url,
|
|
508
534
|
)
|
|
509
535
|
|
|
510
536
|
except Exception as e:
|
|
@@ -552,27 +578,33 @@ class ListMetricTags(BaseDatadogMetricsTool):
|
|
|
552
578
|
params=params,
|
|
553
579
|
)
|
|
554
580
|
|
|
555
|
-
|
|
581
|
+
api_url = None
|
|
556
582
|
query_params = None
|
|
557
583
|
|
|
558
584
|
try:
|
|
559
585
|
metric_name = get_param_or_raise(params, "metric_name")
|
|
560
586
|
|
|
561
|
-
|
|
587
|
+
api_url = f"{self.toolset.dd_config.site_api_url}/api/v2/metrics/{metric_name}/active-configurations"
|
|
562
588
|
headers = get_headers(self.toolset.dd_config)
|
|
563
589
|
|
|
564
590
|
data = execute_datadog_http_request(
|
|
565
|
-
url=
|
|
591
|
+
url=api_url,
|
|
566
592
|
headers=headers,
|
|
567
593
|
timeout=self.toolset.dd_config.request_timeout,
|
|
568
594
|
method="GET",
|
|
569
595
|
payload_or_params={},
|
|
570
596
|
)
|
|
571
597
|
|
|
598
|
+
web_url = generate_datadog_metric_tags_url(
|
|
599
|
+
self.toolset.dd_config,
|
|
600
|
+
metric_name,
|
|
601
|
+
)
|
|
602
|
+
|
|
572
603
|
return StructuredToolResult(
|
|
573
604
|
status=StructuredToolResultStatus.SUCCESS,
|
|
574
605
|
data=data,
|
|
575
606
|
params=params,
|
|
607
|
+
url=web_url,
|
|
576
608
|
)
|
|
577
609
|
|
|
578
610
|
except DataDogRequestError as e:
|
|
@@ -601,8 +633,8 @@ class ListMetricTags(BaseDatadogMetricsTool):
|
|
|
601
633
|
status=StructuredToolResultStatus.ERROR,
|
|
602
634
|
error=error_msg,
|
|
603
635
|
params=params,
|
|
604
|
-
invocation=json.dumps({"url":
|
|
605
|
-
if
|
|
636
|
+
invocation=json.dumps({"url": api_url, "params": query_params})
|
|
637
|
+
if api_url and query_params
|
|
606
638
|
else None,
|
|
607
639
|
)
|
|
608
640
|
|
|
@@ -688,13 +720,12 @@ class DatadogMetricsToolset(Toolset):
|
|
|
688
720
|
return (False, f"Failed to parse Datadog configuration: {str(e)}")
|
|
689
721
|
|
|
690
722
|
def get_example_config(self) -> Dict[str, Any]:
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
}
|
|
723
|
+
example_config = DatadogMetricsConfig(
|
|
724
|
+
dd_api_key="<your_datadog_api_key>",
|
|
725
|
+
dd_app_key="<your_datadog_app_key>",
|
|
726
|
+
site_api_url=AnyUrl("https://api.datadoghq.com"),
|
|
727
|
+
)
|
|
728
|
+
return example_config.model_dump(mode="json")
|
|
698
729
|
|
|
699
730
|
def _reload_instructions(self):
|
|
700
731
|
"""Load Datadog metrics specific troubleshooting instructions."""
|