Skip to content

Commit 0dc2a9e

Browse files
committed
feat(tool): add tool for getting target metadata
Signed-off-by: TJ Hoplock <[email protected]>
1 parent aae4ce8 commit 0dc2a9e

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

pkg/mcp/promapi.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,23 @@ func targetsApiCall(ctx context.Context) (string, error) {
296296
return string(jsonBytes), nil
297297
}
298298

299+
func targetsMetadataApiCall(ctx context.Context, matchTarget, metric, limit string) (string, error) {
300+
ctx, cancel := context.WithTimeout(ctx, apiTimeout)
301+
defer cancel()
302+
303+
tm, err := apiV1Client.TargetsMetadata(ctx, matchTarget, metric, limit)
304+
if err != nil {
305+
return "", fmt.Errorf("error getting target metadata from Prometheus: %w", err)
306+
}
307+
308+
jsonBytes, err := json.Marshal(tm)
309+
if err != nil {
310+
return "", fmt.Errorf("error converting target metadata to JSON: %w", err)
311+
}
312+
313+
return string(jsonBytes), nil
314+
}
315+
299316
func walReplayApiCall(ctx context.Context) (string, error) {
300317
ctx, cancel := context.WithTimeout(ctx, apiTimeout)
301318
defer cancel()

pkg/mcp/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func NewServer(logger *slog.Logger) *server.MCPServer {
3939
mcpServer.AddTool(runtimeinfoTool, runtimeinfoToolHandler)
4040
mcpServer.AddTool(rulesTool, rulesToolHandler)
4141
mcpServer.AddTool(targetsTool, targetsToolHandler)
42+
mcpServer.AddTool(targetsMetadataTool, targetsMetadataToolHandler)
4243
mcpServer.AddTool(walReplayTool, walReplayToolHandler)
4344

4445
return mcpServer

pkg/mcp/tools.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,19 @@ var (
133133
mcp.WithDescription("Get overview of Prometheus target discovery"),
134134
)
135135

136+
targetsMetadataTool = mcp.NewTool("targets_metadata",
137+
mcp.WithDescription("Returns metadata about metrics currently scraped by the target "),
138+
mcp.WithString("match_target",
139+
mcp.Description("[Optional] Label selectors that match targets by their label sets. All targets are selected if left empty."),
140+
),
141+
mcp.WithString("metric",
142+
mcp.Description("[Optional] A metric name to retrieve metadata for. All metric metadata is retrieved if left empty."),
143+
),
144+
mcp.WithString("limit",
145+
mcp.Description("[Optional] Maximum number of targets to match."),
146+
),
147+
)
148+
136149
walReplayTool = mcp.NewTool("wal_replay_status",
137150
mcp.WithDescription("Get current WAL replay status"),
138151
)
@@ -278,7 +291,6 @@ func labelNamesToolHandler(ctx context.Context, request mcp.CallToolRequest) (*m
278291
return mcp.NewToolResultText(data), err
279292
}
280293

281-
// LabelValues performs a query for the values of the given label, time range and matchers.
282294
func labelValuesToolHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
283295
arguments := request.Params.Arguments
284296
label, ok := arguments["label"].(string)
@@ -366,6 +378,28 @@ func targetsToolHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.
366378
return mcp.NewToolResultText(data), err
367379
}
368380

381+
func targetsMetadataToolHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
382+
arguments := request.Params.Arguments
383+
384+
matchTarget := ""
385+
if argMatchTarget, ok := arguments["match_target"].(string); ok {
386+
matchTarget = argMatchTarget
387+
}
388+
389+
metric := ""
390+
if argMetric, ok := arguments["metric"].(string); ok {
391+
metric = argMetric
392+
}
393+
394+
limit := ""
395+
if argLimit, ok := arguments["limit"].(string); ok {
396+
limit = argLimit
397+
}
398+
399+
data, err := targetsMetadataApiCall(ctx, matchTarget, metric, limit)
400+
return mcp.NewToolResultText(data), err
401+
}
402+
369403
func walReplayToolHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
370404
data, err := walReplayApiCall(ctx)
371405
return mcp.NewToolResultText(data), err

0 commit comments

Comments
 (0)