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.
Files changed (162) hide show
  1. holmes/__init__.py +3 -5
  2. holmes/clients/robusta_client.py +4 -3
  3. holmes/common/env_vars.py +18 -2
  4. holmes/common/openshift.py +1 -1
  5. holmes/config.py +11 -6
  6. holmes/core/conversations.py +30 -13
  7. holmes/core/investigation.py +21 -25
  8. holmes/core/investigation_structured_output.py +3 -3
  9. holmes/core/issue.py +1 -1
  10. holmes/core/llm.py +50 -31
  11. holmes/core/models.py +19 -17
  12. holmes/core/openai_formatting.py +1 -1
  13. holmes/core/prompt.py +47 -2
  14. holmes/core/runbooks.py +1 -0
  15. holmes/core/safeguards.py +4 -2
  16. holmes/core/supabase_dal.py +4 -2
  17. holmes/core/tool_calling_llm.py +102 -141
  18. holmes/core/tools.py +19 -28
  19. holmes/core/tools_utils/token_counting.py +9 -2
  20. holmes/core/tools_utils/tool_context_window_limiter.py +13 -30
  21. holmes/core/tools_utils/tool_executor.py +0 -18
  22. holmes/core/tools_utils/toolset_utils.py +1 -0
  23. holmes/core/toolset_manager.py +37 -2
  24. holmes/core/tracing.py +13 -2
  25. holmes/core/transformers/__init__.py +1 -1
  26. holmes/core/transformers/base.py +1 -0
  27. holmes/core/transformers/llm_summarize.py +3 -2
  28. holmes/core/transformers/registry.py +2 -1
  29. holmes/core/transformers/transformer.py +1 -0
  30. holmes/core/truncation/compaction.py +37 -2
  31. holmes/core/truncation/input_context_window_limiter.py +3 -2
  32. holmes/interactive.py +52 -8
  33. holmes/main.py +17 -37
  34. holmes/plugins/interfaces.py +2 -1
  35. holmes/plugins/prompts/__init__.py +2 -1
  36. holmes/plugins/prompts/_fetch_logs.jinja2 +5 -5
  37. holmes/plugins/prompts/_runbook_instructions.jinja2 +2 -1
  38. holmes/plugins/prompts/base_user_prompt.jinja2 +7 -0
  39. holmes/plugins/prompts/conversation_history_compaction.jinja2 +2 -1
  40. holmes/plugins/prompts/generic_ask.jinja2 +0 -2
  41. holmes/plugins/prompts/generic_ask_conversation.jinja2 +0 -2
  42. holmes/plugins/prompts/generic_ask_for_issue_conversation.jinja2 +0 -2
  43. holmes/plugins/prompts/generic_investigation.jinja2 +0 -2
  44. holmes/plugins/prompts/investigation_procedure.jinja2 +2 -1
  45. holmes/plugins/prompts/kubernetes_workload_ask.jinja2 +0 -2
  46. holmes/plugins/prompts/kubernetes_workload_chat.jinja2 +0 -2
  47. holmes/plugins/runbooks/__init__.py +32 -3
  48. holmes/plugins/sources/github/__init__.py +4 -2
  49. holmes/plugins/sources/prometheus/models.py +1 -0
  50. holmes/plugins/toolsets/__init__.py +30 -26
  51. holmes/plugins/toolsets/atlas_mongodb/mongodb_atlas.py +13 -12
  52. holmes/plugins/toolsets/azure_sql/apis/alert_monitoring_api.py +3 -2
  53. holmes/plugins/toolsets/azure_sql/apis/azure_sql_api.py +2 -1
  54. holmes/plugins/toolsets/azure_sql/apis/connection_failure_api.py +3 -2
  55. holmes/plugins/toolsets/azure_sql/apis/connection_monitoring_api.py +3 -1
  56. holmes/plugins/toolsets/azure_sql/apis/storage_analysis_api.py +3 -1
  57. holmes/plugins/toolsets/azure_sql/azure_sql_toolset.py +12 -12
  58. holmes/plugins/toolsets/azure_sql/tools/analyze_connection_failures.py +7 -7
  59. holmes/plugins/toolsets/azure_sql/tools/analyze_database_connections.py +7 -7
  60. holmes/plugins/toolsets/azure_sql/tools/analyze_database_health_status.py +3 -5
  61. holmes/plugins/toolsets/azure_sql/tools/analyze_database_performance.py +3 -3
  62. holmes/plugins/toolsets/azure_sql/tools/analyze_database_storage.py +7 -7
  63. holmes/plugins/toolsets/azure_sql/tools/get_active_alerts.py +6 -8
  64. holmes/plugins/toolsets/azure_sql/tools/get_slow_queries.py +3 -3
  65. holmes/plugins/toolsets/azure_sql/tools/get_top_cpu_queries.py +3 -3
  66. holmes/plugins/toolsets/azure_sql/tools/get_top_data_io_queries.py +3 -3
  67. holmes/plugins/toolsets/azure_sql/tools/get_top_log_io_queries.py +3 -3
  68. holmes/plugins/toolsets/azure_sql/utils.py +0 -32
  69. holmes/plugins/toolsets/bash/argocd/__init__.py +3 -3
  70. holmes/plugins/toolsets/bash/aws/__init__.py +4 -4
  71. holmes/plugins/toolsets/bash/azure/__init__.py +4 -4
  72. holmes/plugins/toolsets/bash/bash_toolset.py +2 -3
  73. holmes/plugins/toolsets/bash/common/bash.py +19 -9
  74. holmes/plugins/toolsets/bash/common/bash_command.py +1 -1
  75. holmes/plugins/toolsets/bash/common/stringify.py +1 -1
  76. holmes/plugins/toolsets/bash/kubectl/__init__.py +2 -1
  77. holmes/plugins/toolsets/bash/kubectl/constants.py +0 -1
  78. holmes/plugins/toolsets/bash/kubectl/kubectl_get.py +3 -4
  79. holmes/plugins/toolsets/bash/parse_command.py +12 -13
  80. holmes/plugins/toolsets/connectivity_check.py +124 -0
  81. holmes/plugins/toolsets/coralogix/api.py +132 -119
  82. holmes/plugins/toolsets/coralogix/coralogix.jinja2 +14 -0
  83. holmes/plugins/toolsets/coralogix/toolset_coralogix.py +219 -0
  84. holmes/plugins/toolsets/coralogix/utils.py +15 -79
  85. holmes/plugins/toolsets/datadog/datadog_api.py +36 -3
  86. holmes/plugins/toolsets/datadog/datadog_logs_instructions.jinja2 +34 -1
  87. holmes/plugins/toolsets/datadog/datadog_metrics_instructions.jinja2 +3 -3
  88. holmes/plugins/toolsets/datadog/datadog_models.py +59 -0
  89. holmes/plugins/toolsets/datadog/datadog_url_utils.py +213 -0
  90. holmes/plugins/toolsets/datadog/instructions_datadog_traces.jinja2 +165 -28
  91. holmes/plugins/toolsets/datadog/toolset_datadog_general.py +71 -28
  92. holmes/plugins/toolsets/datadog/toolset_datadog_logs.py +224 -375
  93. holmes/plugins/toolsets/datadog/toolset_datadog_metrics.py +67 -36
  94. holmes/plugins/toolsets/datadog/toolset_datadog_traces.py +360 -343
  95. holmes/plugins/toolsets/elasticsearch/__init__.py +6 -0
  96. holmes/plugins/toolsets/elasticsearch/elasticsearch.py +834 -0
  97. holmes/plugins/toolsets/git.py +7 -8
  98. holmes/plugins/toolsets/grafana/base_grafana_toolset.py +16 -4
  99. holmes/plugins/toolsets/grafana/common.py +2 -30
  100. holmes/plugins/toolsets/grafana/grafana_tempo_api.py +2 -1
  101. holmes/plugins/toolsets/grafana/loki/instructions.jinja2 +18 -2
  102. holmes/plugins/toolsets/grafana/loki/toolset_grafana_loki.py +92 -18
  103. holmes/plugins/toolsets/grafana/loki_api.py +4 -0
  104. holmes/plugins/toolsets/grafana/toolset_grafana.py +109 -25
  105. holmes/plugins/toolsets/grafana/toolset_grafana_dashboard.jinja2 +22 -0
  106. holmes/plugins/toolsets/grafana/toolset_grafana_tempo.py +201 -33
  107. holmes/plugins/toolsets/grafana/trace_parser.py +3 -2
  108. holmes/plugins/toolsets/internet/internet.py +10 -10
  109. holmes/plugins/toolsets/internet/notion.py +5 -6
  110. holmes/plugins/toolsets/investigator/core_investigation.py +3 -3
  111. holmes/plugins/toolsets/investigator/model.py +3 -1
  112. holmes/plugins/toolsets/json_filter_mixin.py +134 -0
  113. holmes/plugins/toolsets/kafka.py +12 -7
  114. holmes/plugins/toolsets/kubernetes.yaml +260 -30
  115. holmes/plugins/toolsets/kubernetes_logs.py +3 -3
  116. holmes/plugins/toolsets/logging_utils/logging_api.py +16 -6
  117. holmes/plugins/toolsets/mcp/toolset_mcp.py +88 -60
  118. holmes/plugins/toolsets/newrelic/new_relic_api.py +41 -1
  119. holmes/plugins/toolsets/newrelic/newrelic.jinja2 +24 -0
  120. holmes/plugins/toolsets/newrelic/newrelic.py +212 -55
  121. holmes/plugins/toolsets/prometheus/prometheus.py +358 -102
  122. holmes/plugins/toolsets/prometheus/prometheus_instructions.jinja2 +11 -3
  123. holmes/plugins/toolsets/rabbitmq/api.py +23 -4
  124. holmes/plugins/toolsets/rabbitmq/toolset_rabbitmq.py +5 -5
  125. holmes/plugins/toolsets/robusta/robusta.py +5 -5
  126. holmes/plugins/toolsets/runbook/runbook_fetcher.py +25 -6
  127. holmes/plugins/toolsets/servicenow_tables/servicenow_tables.py +1 -1
  128. holmes/plugins/toolsets/utils.py +1 -1
  129. holmes/utils/config_utils.py +1 -1
  130. holmes/utils/connection_utils.py +31 -0
  131. holmes/utils/console/result.py +10 -0
  132. holmes/utils/file_utils.py +2 -1
  133. holmes/utils/global_instructions.py +10 -26
  134. holmes/utils/holmes_status.py +4 -3
  135. holmes/utils/log.py +15 -0
  136. holmes/utils/markdown_utils.py +2 -3
  137. holmes/utils/memory_limit.py +58 -0
  138. holmes/utils/sentry_helper.py +23 -0
  139. holmes/utils/stream.py +12 -5
  140. holmes/utils/tags.py +4 -3
  141. holmes/version.py +3 -1
  142. {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/METADATA +12 -10
  143. holmesgpt-0.18.4.dist-info/RECORD +258 -0
  144. holmes/plugins/toolsets/aws.yaml +0 -80
  145. holmes/plugins/toolsets/coralogix/toolset_coralogix_logs.py +0 -114
  146. holmes/plugins/toolsets/datadog/datadog_traces_formatter.py +0 -310
  147. holmes/plugins/toolsets/datadog/toolset_datadog_rds.py +0 -736
  148. holmes/plugins/toolsets/grafana/grafana_api.py +0 -64
  149. holmes/plugins/toolsets/opensearch/__init__.py +0 -0
  150. holmes/plugins/toolsets/opensearch/opensearch.py +0 -250
  151. holmes/plugins/toolsets/opensearch/opensearch_logs.py +0 -161
  152. holmes/plugins/toolsets/opensearch/opensearch_traces.py +0 -215
  153. holmes/plugins/toolsets/opensearch/opensearch_traces_instructions.jinja2 +0 -12
  154. holmes/plugins/toolsets/opensearch/opensearch_utils.py +0 -166
  155. holmes/utils/keygen_utils.py +0 -6
  156. holmesgpt-0.16.2a0.dist-info/RECORD +0 -258
  157. holmes/plugins/toolsets/{opensearch → elasticsearch}/opensearch_ppl_query_docs.jinja2 +0 -0
  158. holmes/plugins/toolsets/{opensearch → elasticsearch}/opensearch_query_assist.py +2 -2
  159. /holmes/plugins/toolsets/{opensearch → elasticsearch}/opensearch_query_assist_instructions.jinja2 +0 -0
  160. {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/LICENSE +0 -0
  161. {holmesgpt-0.16.2a0.dist-info → holmesgpt-0.18.4.dist-info}/WHEEL +0 -0
  162. {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 typing import Any, Optional, Dict, Tuple
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
- DatadogBaseConfig,
24
+ MAX_RETRY_COUNT_ON_RATE_LIMIT,
21
25
  DataDogRequestError,
22
26
  execute_datadog_http_request,
23
27
  get_headers,
24
- MAX_RETRY_COUNT_ON_RATE_LIMIT,
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
- data_str = json.dumps(response_data, indent=2)
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=data_str,
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
- url = f"{self.toolset.dd_config.site_api_url}/api/v1/metrics/{metric_name}"
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=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=json.dumps(response_data, indent=2),
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=json.dumps(response_data, indent=2),
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
- url = None
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
- url = f"{self.toolset.dd_config.site_api_url}/api/v2/metrics/{metric_name}/active-configurations"
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=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": url, "params": query_params})
605
- if url and query_params
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
- return {
692
- "dd_api_key": "your-datadog-api-key",
693
- "dd_app_key": "your-datadog-application-key",
694
- "site_api_url": "https://api.datadoghq.com",
695
- "default_limit": 1000,
696
- "request_timeout": 60,
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."""