// internal/tools/v1/events.go
package v1
import (
"context"
"encoding/json"
"fmt"
"log"
"time"
v1 "github.com/chussenot/datadog-mcp/internal/api/v1"
"github.com/chussenot/datadog-mcp/internal/client"
"github.com/chussenot/datadog-mcp/internal/types"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
// ListEvents lists events from DataDog
func ListEvents(ctx context.Context, client *client.DataDogClient, args types.ListEventsArgs) (*mcp.CallToolResult, any, error) {
// Default to last hour if no time range specified
now := time.Now().Unix()
startTime := now - 3600 // 1 hour ago
endTime := now
if args.Start != nil {
startTime = *args.Start
}
if args.End != nil {
endTime = *args.End
}
params := &v1.ListEventsParams{
Start: startTime,
End: endTime,
}
if args.Priority != nil {
priority := v1.EventPriority(*args.Priority)
params.Priority = &priority
}
if args.Tags != nil {
params.Tags = args.Tags
}
log.Printf("🔍 Calling DataDog API v1: ListEvents with params: %+v", params)
resp, err := client.Client.ListEventsWithResponse(ctx, params)
if err != nil {
log.Printf("❌ API call error: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API call failed: %v", err)}},
}, nil, nil
}
log.Printf("📊 API Response Status: %d", resp.StatusCode())
log.Printf("📊 API Response Headers: %+v", resp.HTTPResponse.Header)
// Check response status
if resp.StatusCode() < 200 || resp.StatusCode() >= 300 {
body := "No response body"
if resp.Body != nil {
body = string(resp.Body)
}
log.Printf("❌ API error response: status %d, body: %s", resp.StatusCode(), body)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API returned status %d: %s", resp.StatusCode(), body)}},
}, nil, nil
}
// Check if we have JSON response data
if resp.JSON200 == nil {
log.Printf("❌ No JSON200 data in response")
log.Printf("❌ Response body: %s", string(resp.Body))
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: "No JSON response data available"}},
}, nil, nil
}
// Convert the response to JSON string
jsonBytes, err := json.Marshal(resp.JSON200)
if err != nil {
log.Printf("❌ Failed to marshal JSON response: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Failed to marshal response: %v", err)}},
}, nil, nil
}
log.Printf("✅ Successfully retrieved events")
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: string(jsonBytes)},
},
}, nil, nil
}
// CreateEvent creates a new event in DataDog
func CreateEvent(ctx context.Context, client *client.DataDogClient, args types.CreateEventArgs) (*mcp.CallToolResult, any, error) {
priority := v1.EventPriorityNORMAL
if args.Priority != nil {
priority = v1.EventPriority(*args.Priority)
}
event := v1.EventCreateRequest{
Title: args.Title,
Text: args.Text,
Priority: &priority,
Tags: &args.Tags,
}
log.Printf("🔍 Calling DataDog API v1: CreateEvent with title: %s", args.Title)
resp, err := client.Client.CreateEventWithResponse(ctx, event)
if err != nil {
log.Printf("❌ API call error: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API call failed: %v", err)}},
}, nil, nil
}
log.Printf("📊 API Response Status: %d", resp.StatusCode())
log.Printf("📊 API Response Headers: %+v", resp.HTTPResponse.Header)
// Check response status
if resp.StatusCode() < 200 || resp.StatusCode() >= 300 {
body := "No response body"
if resp.Body != nil {
body = string(resp.Body)
}
log.Printf("❌ API error response: status %d, body: %s", resp.StatusCode(), body)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("API returned status %d: %s", resp.StatusCode(), body)}},
}, nil, nil
}
// Check if we have JSON response data (CreateEvent returns 202)
if resp.JSON202 == nil {
log.Printf("❌ No JSON202 data in response")
log.Printf("❌ Response body: %s", string(resp.Body))
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: "No JSON response data available"}},
}, nil, nil
}
// Convert the response to JSON string
jsonBytes, err := json.Marshal(resp.JSON202)
if err != nil {
log.Printf("❌ Failed to marshal JSON response: %v", err)
return &mcp.CallToolResult{
IsError: true,
Content: []mcp.Content{&mcp.TextContent{Text: fmt.Sprintf("Failed to marshal response: %v", err)}},
}, nil, nil
}
log.Printf("✅ Successfully created event: %s", *resp.JSON202.Event.Title)
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: string(jsonBytes)},
},
}, nil, nil
}