holmesgpt 0.13.3__py3-none-any.whl → 0.14.0a0__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.

Potentially problematic release.


This version of holmesgpt might be problematic. Click here for more details.

@@ -187,7 +187,7 @@ def format_traces_list(trace_data: Dict) -> str:
187
187
  else "\n"
188
188
  )
189
189
  trace_str += f"\tstartTime={unix_nano_to_rfc3339(int(trace.get('startTimeUnixNano')))}"
190
- trace_str += f" rootServiceName={trace.get('trootServiceName')}"
190
+ trace_str += f" rootServiceName={trace.get('rootServiceName')}"
191
191
  trace_str += f" rootTraceName={trace.get('rootTraceName')}"
192
192
  traces_str.append(trace_str)
193
193
  return "\n".join(traces_str)
@@ -79,7 +79,7 @@ class GetLogs(BaseNewRelicTool):
79
79
 
80
80
  try:
81
81
  logging.info(f"Getting New Relic logs for app {app} since {since}")
82
- response = requests.post(url, headers=headers, json=query)
82
+ response = requests.post(url, headers=headers, json=query) # type: ignore[arg-type]
83
83
 
84
84
  if response.status_code == 200:
85
85
  return success(response.json())
@@ -164,7 +164,7 @@ class GetTraces(BaseNewRelicTool):
164
164
 
165
165
  try:
166
166
  logging.info(f"Getting New Relic traces with duration > {duration}s")
167
- response = requests.post(url, headers=headers, json=query)
167
+ response = requests.post(url, headers=headers, json=query) # type: ignore[arg-type]
168
168
 
169
169
  if response.status_code == 200:
170
170
  return success(response.json())
@@ -197,7 +197,7 @@ class NewRelicToolset(Toolset):
197
197
  super().__init__(
198
198
  name="newrelic",
199
199
  description="Toolset for interacting with New Relic to fetch logs and traces",
200
- docs_url="https://docs.newrelic.com/docs/apis/nerdgraph-api/",
200
+ docs_url="https://holmesgpt.dev/data-sources/builtin-toolsets/newrelic/",
201
201
  icon_url="https://companieslogo.com/img/orig/NEWR-de5fcb2e.png?t=1720244493",
202
202
  prerequisites=[CallablePrerequisite(callable=self.prerequisites_callable)],
203
203
  tools=[
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: holmesgpt
3
- Version: 0.13.3
3
+ Version: 0.14.0a0
4
4
  Summary:
5
5
  Author: Natan Yellin
6
6
  Author-email: natan@robusta.dev
@@ -35,7 +35,7 @@ Requires-Dist: mcp (==v1.12.2)
35
35
  Requires-Dist: openai (>=1.6.1,<1.100.0)
36
36
  Requires-Dist: opensearch-py (>=2.8.0,<3.0.0)
37
37
  Requires-Dist: postgrest (==0.16.8)
38
- Requires-Dist: prometrix (==0.2.3)
38
+ Requires-Dist: prometrix (==0.2.5)
39
39
  Requires-Dist: prompt-toolkit (>=3.0.51,<4.0.0)
40
40
  Requires-Dist: protobuf (>=6.31.1)
41
41
  Requires-Dist: pydantic (>=2.7,<3.0)
@@ -1,5 +1,5 @@
1
1
  holmes/.git_archival.json,sha256=PbwdO7rNhEJ4ALiO12DPPb81xNAIsVxCA0m8OrVoqsk,182
2
- holmes/__init__.py,sha256=8wTYyPOjl8qDr6BiYOrAsU76iYg_9luKrV-TylK8LQw,257
2
+ holmes/__init__.py,sha256=6EFHBvUBpblW6V0uBPWb-MI_VRb2nAh-QMWNn_XRRVQ,263
3
3
  holmes/clients/robusta_client.py,sha256=lHV02aKJmAb08jVhjQ6jWvhhmjQ86Ajbo_lgbhqfn3s,1221
4
4
  holmes/common/env_vars.py,sha256=-P834z71-S7cklgTB7DX0OuTLzxwmAT3WETt3svBUY0,3013
5
5
  holmes/common/openshift.py,sha256=akbQ0GpnmuzXOqTcotpTDQSDKIROypS9mgPOprUgkCw,407
@@ -20,13 +20,13 @@ holmes/core/runbooks.py,sha256=Oj5ICmiGgaq57t4erPzQDvHQ0rMGj1nhiiYhl8peH3Q,939
20
20
  holmes/core/safeguards.py,sha256=SAw-J9y3uAehJVZJYsFs4C62jzLV4p_C07F2jUuJHug,4895
21
21
  holmes/core/supabase_dal.py,sha256=-AtQ6oDyIpoc2a46xA26e8416kUD4tj2Q3p4P42PFP4,21291
22
22
  holmes/core/todo_tasks_formatter.py,sha256=USyJZcoX6zoxID1UV-abAKdaWFYLO6QJd-UKryJAurI,1487
23
- holmes/core/tool_calling_llm.py,sha256=hdGmkm8fMaa7zRy4x2F8xMTYo1b1vpaHtQnfxXtG8VQ,41175
23
+ holmes/core/tool_calling_llm.py,sha256=B1D-0QyVfYW-p3pfbbDo4DRoBEpzV7uN6IiH48i61XQ,42018
24
24
  holmes/core/tools.py,sha256=Xj7Yoztf9OqrGMSwhWBNmIwoZ147P6qi7U6vt0PNgBQ,21380
25
25
  holmes/core/tools_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  holmes/core/tools_utils/tool_executor.py,sha256=wLuyr1O8zkNXaZ_MzWm5hUDcOI3tB9I4YiserDhIu-E,2375
27
27
  holmes/core/tools_utils/toolset_utils.py,sha256=SvWzen8Fg_TB_6Idw1hK0nCPrJL40ueWVMfsv8Kh2RY,2363
28
28
  holmes/core/toolset_manager.py,sha256=PVmhRaSZntcJ_-jE3W2vHwZgAXIprPIgq0YMGYhmcZs,18451
29
- holmes/core/tracing.py,sha256=j7tC4xuPHTU3s1m8Y7kClNfGOSBTHBINFkr1NmYe51Y,8986
29
+ holmes/core/tracing.py,sha256=o1vTLCbnFvBOVnQKqRaj4HDNYGYAd4ub2IgkV1E3qY4,9130
30
30
  holmes/interactive.py,sha256=l1kh0ABXO_RWIzkEuLkedM-73k1ezENAvXMrgNeqsKA,41836
31
31
  holmes/main.py,sha256=e_J4B1oMPbBiKz8cf-m_UJbhdk98AgAPS1LsU67PEe8,34813
32
32
  holmes/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -149,24 +149,24 @@ holmes/plugins/toolsets/datadog/datadog_metrics_instructions.jinja2,sha256=_59Dz
149
149
  holmes/plugins/toolsets/datadog/datadog_rds_instructions.jinja2,sha256=lbI6lkcMjG1CVKeL0XDkq5zl-fRDVxZ_t_CjS-Uh_OM,3119
150
150
  holmes/plugins/toolsets/datadog/datadog_traces_formatter.py,sha256=uTtWTrsbvO9cZcUDskJE9p5sEscieXwhEpxvRKkaiEw,10275
151
151
  holmes/plugins/toolsets/datadog/instructions_datadog_traces.jinja2,sha256=9j3-46UNE35DE2xBDTCRt1EedgNdgRXuC1u-X3yB-9I,1487
152
- holmes/plugins/toolsets/datadog/toolset_datadog_general.py,sha256=vT6E6tBBQM70o793c3OXRgzdode91dlFMnh2_XNn8Ug,27274
153
- holmes/plugins/toolsets/datadog/toolset_datadog_logs.py,sha256=2WbfvJRSj1sIvTshq1zdWvcpF5LmmnuBV-jE0xs0si8,9954
154
- holmes/plugins/toolsets/datadog/toolset_datadog_metrics.py,sha256=cngHD2vEmqLJV0afg-JSlfPz43DtAY3yCTnlM-kQWss,24810
152
+ holmes/plugins/toolsets/datadog/toolset_datadog_general.py,sha256=ZYMqyycrnbr530xuF0WYiKyAbCdxeDPKYIvw0ito1Dc,27265
153
+ holmes/plugins/toolsets/datadog/toolset_datadog_logs.py,sha256=lpZYyrMeg9225gY8vuwAGGQb0XzfhYpdrVyVNE0PANE,9940
154
+ holmes/plugins/toolsets/datadog/toolset_datadog_metrics.py,sha256=_3C-x-P4KmaKmuqNQI9vlI7n-aqU30a8Qabu3xPhGOA,24793
155
155
  holmes/plugins/toolsets/datadog/toolset_datadog_rds.py,sha256=5nxqZ93Fx8AmGr7KvF76erk-YsFDIL35KhEJrWsklcQ,29015
156
- holmes/plugins/toolsets/datadog/toolset_datadog_traces.py,sha256=yFkEzignhXVvC3KP-PmamhyssyEhKSWa2o8M0lYJiKU,26059
156
+ holmes/plugins/toolsets/datadog/toolset_datadog_traces.py,sha256=1NXO1gnqSB2qKFSRw3M9kex5mVTiOX393CBeyQ_TXfE,26044
157
157
  holmes/plugins/toolsets/docker.yaml,sha256=O0Q0z0kZS8_QBEhwrUfbXdGUn1nP1K9k0FlQd6EZVJ4,1559
158
- holmes/plugins/toolsets/git.py,sha256=7D_LEtzHgrcQmIWOG6-hhSCESdZLNb4IWfDhrvxeGP8,32001
158
+ holmes/plugins/toolsets/git.py,sha256=JVDHl_im9GZepk2Ir4AAaeMbDVqfkMzrsUgR-GaGDck,32029
159
159
  holmes/plugins/toolsets/grafana/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
160
  holmes/plugins/toolsets/grafana/base_grafana_toolset.py,sha256=AjvbS4txSo97YqeeFlXUnu95oPFt8rB-CD1Ccf92a04,1760
161
- holmes/plugins/toolsets/grafana/common.py,sha256=BoPZwZ3_MSWGYhJ7lBOuWb292r4qfCiMBOXuXEKY8xA,2103
161
+ holmes/plugins/toolsets/grafana/common.py,sha256=ycAuGVGL0iAUh1K_cukG2UyTHWDXhj1gBOYkU3A1Ofo,2439
162
162
  holmes/plugins/toolsets/grafana/grafana_api.py,sha256=nq7KWoUAfFxp1-3VqKadPNKbTifLTgKUAZOFUH5QWUY,1665
163
+ holmes/plugins/toolsets/grafana/grafana_tempo_api.py,sha256=bcCPEwOwm1Og9LYR6PlAtjGgQopvySNjf5nTwILuFt4,15697
163
164
  holmes/plugins/toolsets/grafana/loki_api.py,sha256=f7oTzfhJ1LojsPoAfsKt32ADWffLEywBJQWG9eyfb7I,2529
164
- holmes/plugins/toolsets/grafana/tempo_api.py,sha256=UbLfyzA5TbP-5jx4Dkc20xLlR-6Z4z-4nPKrMlzgCRU,3565
165
165
  holmes/plugins/toolsets/grafana/toolset_grafana.py,sha256=GsCxsaWNXzOoA6eoaH9LN6ezUcxdFSgg1iWpqqvcVX0,4882
166
166
  holmes/plugins/toolsets/grafana/toolset_grafana_loki.py,sha256=Xc80raV16wlt05hdPslkb8ru40h2GYFc2Y80bR1bvlM,3846
167
- holmes/plugins/toolsets/grafana/toolset_grafana_tempo.jinja2,sha256=AKRXmFTq6BTovJ6aC7dSbqfURRu0y6NTMLyp1ZJeVN4,1436
168
- holmes/plugins/toolsets/grafana/toolset_grafana_tempo.py,sha256=A34_xlssBxbC3KmTLjwkvdCM1-5KR0oO9KO-c6irj2g,22719
169
- holmes/plugins/toolsets/grafana/trace_parser.py,sha256=O6fJqUwvpCKL5hAdDtPIZ3LkpTbcDSVPLlLIdNqAbuk,7025
167
+ holmes/plugins/toolsets/grafana/toolset_grafana_tempo.jinja2,sha256=VU49G5fxIJFny2wS2gvRBiyuCXEnvB7JqrJGLF6i0dY,6490
168
+ holmes/plugins/toolsets/grafana/toolset_grafana_tempo.py,sha256=bgydZ-jAOxQANdSFN_p_7B7wurcNKVTs2RbqVeMwNEU,43794
169
+ holmes/plugins/toolsets/grafana/trace_parser.py,sha256=8PjqPGDGo9uB2Z8WWWknMKdhcqlqZEVncQCCkl2F06A,7024
170
170
  holmes/plugins/toolsets/helm.yaml,sha256=-IPDChKMHcxGbzA0z9GKczRshL-mD24cHpBizfNM1jM,1604
171
171
  holmes/plugins/toolsets/internet/internet.py,sha256=zuI6tTdGF1ahg16xsIisRw3EPT6Tb1dCPlZ8bvCVry8,7749
172
172
  holmes/plugins/toolsets/internet/notion.py,sha256=dIeXJUCOZBdGmcgJJWeH2RcTyXdPsfNONj7T0_5iap4,4757
@@ -182,7 +182,7 @@ holmes/plugins/toolsets/logging_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
182
182
  holmes/plugins/toolsets/logging_utils/logging_api.py,sha256=seW5DNSzREQx4nmkt9NEqN21j8jTPNSJyOkCrdcdWoQ,11615
183
183
  holmes/plugins/toolsets/logging_utils/types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
184
  holmes/plugins/toolsets/mcp/toolset_mcp.py,sha256=tYc_fjBE3ycM2HPJjwW_EviSb2B8Psf3pj_AnMQZ01g,4874
185
- holmes/plugins/toolsets/newrelic.py,sha256=diC1zNhV9awH0in7WdOL_L5PaLFQ_u_F-JCSHptGmKY,7843
185
+ holmes/plugins/toolsets/newrelic.py,sha256=0WyGqtr836J3mEvpC0j3fKa4VzRb3YgLYm68q_-G6Mc,7906
186
186
  holmes/plugins/toolsets/opensearch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
187
  holmes/plugins/toolsets/opensearch/opensearch.py,sha256=rLbwYQJbKsPRA57rbo9Kae9v7SNd8B0GZqHVUk3UJWQ,8616
188
188
  holmes/plugins/toolsets/opensearch/opensearch_logs.py,sha256=-WlOPzjLwQuEoKi_4r5KZZNnKuvBZO0EFO2NnFflf1M,5859
@@ -227,8 +227,8 @@ holmes/utils/pydantic_utils.py,sha256=g0e0jLTa8Je8JKrhEP4N5sMxj0_hhPOqFZr0Vpd67s
227
227
  holmes/utils/stream.py,sha256=Z9duSET8uXx-1dqPBjGuDKBxkJMaMsCrOqOXrVbtjGw,2806
228
228
  holmes/utils/tags.py,sha256=SU4EZMBtLlIb7OlHsSpguFaypczRzOcuHYxDSanV3sQ,3364
229
229
  holmes/version.py,sha256=uDRPOvVaHreROj_9HPe81RVpTzHcG8ojpGTsnJIlQOM,5220
230
- holmesgpt-0.13.3.dist-info/LICENSE.txt,sha256=RdZMj8VXRQdVslr6PMYMbAEu5pOjOdjDqt3yAmWb9Ds,1072
231
- holmesgpt-0.13.3.dist-info/METADATA,sha256=825O5gscyikyfjYadAlKfq7eMGY6PBzRj2kx4H8Tc18,16237
232
- holmesgpt-0.13.3.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
233
- holmesgpt-0.13.3.dist-info/entry_points.txt,sha256=JdzEyZhpaYr7Boo4uy4UZgzY1VsAEbzMgGmHZtx9KFY,42
234
- holmesgpt-0.13.3.dist-info/RECORD,,
230
+ holmesgpt-0.14.0a0.dist-info/LICENSE.txt,sha256=RdZMj8VXRQdVslr6PMYMbAEu5pOjOdjDqt3yAmWb9Ds,1072
231
+ holmesgpt-0.14.0a0.dist-info/METADATA,sha256=TT4hUs10TqA-shY5RUPfIWdPhiza6qETumt_fFJvASI,16239
232
+ holmesgpt-0.14.0a0.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
233
+ holmesgpt-0.14.0a0.dist-info/entry_points.txt,sha256=JdzEyZhpaYr7Boo4uy4UZgzY1VsAEbzMgGmHZtx9KFY,42
234
+ holmesgpt-0.14.0a0.dist-info/RECORD,,
@@ -1,124 +0,0 @@
1
- import requests # type: ignore
2
- from typing import Dict, List, Optional
3
- import backoff
4
-
5
- from holmes.plugins.toolsets.grafana.common import build_headers
6
- from holmes.plugins.toolsets.grafana.trace_parser import process_trace
7
-
8
-
9
- def execute_tempo_query_with_retry(
10
- base_url: str,
11
- api_key: Optional[str],
12
- headers: Optional[Dict[str, str]],
13
- query_params: dict,
14
- retries: int = 3,
15
- timeout: int = 5,
16
- ):
17
- """
18
- Execute a Tempo API query through Grafana with retries and timeout.
19
-
20
- Args:
21
- tempo_datasource_uid: The UID of the Tempo datasource.
22
- query_params: Query parameters for the API.
23
- retries: Number of retries for the request.
24
- timeout: Timeout for each request in seconds.
25
-
26
- Returns:
27
- List of trace results.
28
- """
29
- url = f"{base_url}/api/search"
30
-
31
- @backoff.on_exception(
32
- backoff.expo, # Exponential backoff
33
- requests.exceptions.RequestException, # Retry on request exceptions
34
- max_tries=retries, # Maximum retries
35
- giveup=lambda e: isinstance(e, requests.exceptions.HTTPError)
36
- and e.response.status_code < 500,
37
- )
38
- def make_request():
39
- response = requests.post(
40
- url,
41
- headers=build_headers(api_key=api_key, additional_headers=headers),
42
- json=query_params,
43
- timeout=timeout, # Set timeout for the request
44
- )
45
- response.raise_for_status() # Raise an error for non-2xx responses
46
- return response.json()
47
-
48
- try:
49
- return make_request()
50
- except requests.exceptions.RequestException as e:
51
- raise Exception(f"Request to Tempo API failed after retries: {e}")
52
-
53
-
54
- def query_tempo_traces(
55
- base_url: str,
56
- api_key: Optional[str],
57
- headers: Optional[Dict[str, str]],
58
- query: Optional[str],
59
- start: int,
60
- end: int,
61
- limit: int,
62
- ) -> Dict:
63
- query_params = {
64
- "start": str(start),
65
- "end": str(end),
66
- "limit": str(limit),
67
- }
68
-
69
- if query:
70
- query_params["q"] = query
71
- data = execute_tempo_query_with_retry(
72
- base_url=base_url,
73
- api_key=api_key,
74
- headers=headers,
75
- query_params=query_params,
76
- )
77
- return data
78
-
79
-
80
- def query_tempo_trace_by_id(
81
- base_url: str,
82
- api_key: Optional[str],
83
- headers: Optional[Dict[str, str]],
84
- trace_id: str,
85
- key_labels: List[str],
86
- retries: int = 3,
87
- timeout: int = 5,
88
- ) -> str:
89
- """
90
- Query Tempo for a specific trace by its ID with retries and backoff.
91
-
92
- Args:
93
- tempo_datasource_id: The ID of the Tempo datasource.
94
- trace_id: The trace ID to retrieve.
95
- retries: Number of retries for the request.
96
- timeout: Timeout for each request in seconds.
97
-
98
- Returns:
99
- A formatted trace details string
100
- """
101
- url = f"{base_url}/api/traces/{trace_id}"
102
-
103
- @backoff.on_exception(
104
- backoff.expo,
105
- requests.exceptions.RequestException,
106
- max_tries=retries,
107
- giveup=lambda e: isinstance(e, requests.exceptions.HTTPError)
108
- and e.response.status_code < 500,
109
- )
110
- def make_request():
111
- response = requests.get(
112
- url,
113
- headers=build_headers(api_key=api_key, additional_headers=headers),
114
- timeout=timeout,
115
- )
116
- response.raise_for_status()
117
- return process_trace(response.json(), key_labels)
118
-
119
- try:
120
- return make_request()
121
- except requests.exceptions.RequestException as e:
122
- raise Exception(
123
- f"Failed to retrieve trace by ID after retries: {e} \n for URL: {url}"
124
- )