Skip to content

Commit 8115539

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

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

pkg/mcp/promapi.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,23 @@ func targetsMetadataApiCall(ctx context.Context, matchTarget, metric, limit stri
313313
return string(jsonBytes), nil
314314
}
315315

316+
func metricMetadataApiCall(ctx context.Context, metric, limit string) (string, error) {
317+
ctx, cancel := context.WithTimeout(ctx, apiTimeout)
318+
defer cancel()
319+
320+
mm, err := apiV1Client.Metadata(ctx, metric, limit)
321+
if err != nil {
322+
return "", fmt.Errorf("error getting metric metadata from Prometheus: %w", err)
323+
}
324+
325+
jsonBytes, err := json.Marshal(mm)
326+
if err != nil {
327+
return "", fmt.Errorf("error converting metric metadata to JSON: %w", err)
328+
}
329+
330+
return string(jsonBytes), nil
331+
}
332+
316333
func walReplayApiCall(ctx context.Context) (string, error) {
317334
ctx, cancel := context.WithTimeout(ctx, apiTimeout)
318335
defer cancel()

pkg/mcp/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func NewServer(logger *slog.Logger) *server.MCPServer {
4040
mcpServer.AddTool(rulesTool, rulesToolHandler)
4141
mcpServer.AddTool(targetsTool, targetsToolHandler)
4242
mcpServer.AddTool(targetsMetadataTool, targetsMetadataToolHandler)
43+
mcpServer.AddTool(metricMetadataTool, metricMetadataToolHandler)
4344
mcpServer.AddTool(walReplayTool, walReplayToolHandler)
4445

4546
return mcpServer

pkg/mcp/tools.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ var (
146146
),
147147
)
148148

149+
metricMetadataTool = mcp.NewTool("metric_metadata",
150+
mcp.WithDescription("Returns metadata about metrics currently scraped by the metric name."),
151+
mcp.WithString("metric",
152+
mcp.Description("[Optional] A metric name to retrieve metadata for. All metric metadata is retrieved if left empty."),
153+
),
154+
mcp.WithString("limit",
155+
mcp.Description("[Optional] Maximum number of metrics to return."),
156+
),
157+
)
158+
149159
walReplayTool = mcp.NewTool("wal_replay_status",
150160
mcp.WithDescription("Get current WAL replay status"),
151161
)
@@ -400,6 +410,25 @@ func targetsMetadataToolHandler(ctx context.Context, request mcp.CallToolRequest
400410
return mcp.NewToolResultText(data), err
401411
}
402412

413+
// // Metadata returns metadata about metrics currently scraped by the metric name.
414+
// Metadata(ctx context.Context, metric, limit string) (map[string][]Metadata, error)
415+
func metricMetadataToolHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
416+
arguments := request.Params.Arguments
417+
418+
metric := ""
419+
if argMetric, ok := arguments["metric"].(string); ok {
420+
metric = argMetric
421+
}
422+
423+
limit := ""
424+
if argLimit, ok := arguments["limit"].(string); ok {
425+
limit = argLimit
426+
}
427+
428+
data, err := metricMetadataApiCall(ctx, metric, limit)
429+
return mcp.NewToolResultText(data), err
430+
}
431+
403432
func walReplayToolHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
404433
data, err := walReplayApiCall(ctx)
405434
return mcp.NewToolResultText(data), err

0 commit comments

Comments
 (0)