From fe58d362b1f300403d15a2eecc8ae8941bb4ad9f Mon Sep 17 00:00:00 2001 From: AnnatarHe Date: Tue, 16 Dec 2025 20:41:48 +0800 Subject: [PATCH 1/2] refactor(otel): remove unused SendCCSessionEnd function and types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- model/api_ccotel.go | 20 -------------------- model/ccotel_types.go | 27 --------------------------- 2 files changed, 47 deletions(-) diff --git a/model/api_ccotel.go b/model/api_ccotel.go index 502891b..84ce51c 100644 --- a/model/api_ccotel.go +++ b/model/api_ccotel.go @@ -29,23 +29,3 @@ func SendCCOtelData(ctx context.Context, req *CCOtelRequest, endpoint Endpoint) return &resp, nil } - -// SendCCSessionEnd notifies the backend that a session has ended -// POST /api/v1/cc/session/end -func SendCCSessionEnd(ctx context.Context, req *CCSessionEndRequest, endpoint Endpoint) error { - ctx, span := modelTracer.Start(ctx, "ccotel.session.end") - defer span.End() - - var resp CCSessionEndResponse - err := SendHTTPRequestJSON(HTTPRequestOptions[*CCSessionEndRequest, CCSessionEndResponse]{ - Context: ctx, - Endpoint: endpoint, - Method: http.MethodPost, - Path: "/api/v1/cc/session/end", - Payload: req, - Response: &resp, - Timeout: 30 * time.Second, - }) - - return err -} diff --git a/model/ccotel_types.go b/model/ccotel_types.go index fd0e047..469dc49 100644 --- a/model/ccotel_types.go +++ b/model/ccotel_types.go @@ -84,33 +84,6 @@ type CCOtelResponse struct { Message string `json:"message,omitempty"` } -// CCSessionEndRequest is the request to POST /api/v1/cc/session/end -type CCSessionEndRequest struct { - Host string `json:"host"` - SessionID string `json:"sessionId"` - EndedAt int64 `json:"endedAt"` - ActiveTimeSeconds int `json:"activeTimeSeconds,omitempty"` - TotalPrompts int `json:"totalPrompts,omitempty"` - TotalToolCalls int `json:"totalToolCalls,omitempty"` - TotalApiRequests int `json:"totalApiRequests,omitempty"` - TotalCostUSD float64 `json:"totalCostUsd,omitempty"` - LinesAdded int `json:"linesAdded,omitempty"` - LinesRemoved int `json:"linesRemoved,omitempty"` - CommitsCreated int `json:"commitsCreated,omitempty"` - PRsCreated int `json:"prsCreated,omitempty"` - TotalInputTokens int64 `json:"totalInputTokens,omitempty"` - TotalOutputTokens int64 `json:"totalOutputTokens,omitempty"` - TotalCacheReadTokens int64 `json:"totalCacheReadTokens,omitempty"` - TotalCacheCreationTokens int64 `json:"totalCacheCreationTokens,omitempty"` -} - -// CCSessionEndResponse is the response from POST /api/v1/cc/session/end -type CCSessionEndResponse struct { - Code int `json:"code"` - Data interface{} `json:"data"` - Message string `json:"message"` -} - // Claude Code OTEL metric types const ( CCMetricSessionCount = "session_count" From 67d6b01f101200a8033d4cee49d36cb2d644fb5f Mon Sep 17 00:00:00 2001 From: AnnatarHe Date: Wed, 17 Dec 2025 02:16:06 +0800 Subject: [PATCH 2/2] fix(otel): add missing WSL version, prompt, and tool parameters tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add WSLVersion field to CCOtelSession for WSL environment detection - Add Prompt field to CCOtelEvent for capturing prompt content - Add tool_parameters parsing logic with JSON deserialization - Add encoding/json import for tool parameters handling 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- daemon/ccotel_processor.go | 15 +++++++++++++++ model/ccotel_types.go | 26 ++++++++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/daemon/ccotel_processor.go b/daemon/ccotel_processor.go index bebe89c..362d25b 100644 --- a/daemon/ccotel_processor.go +++ b/daemon/ccotel_processor.go @@ -2,6 +2,7 @@ package daemon import ( "context" + "encoding/json" "log/slog" "os" "time" @@ -187,6 +188,8 @@ func extractSessionFromResource(resource *resourcev1.Resource) *model.CCOtelSess session.OSVersion = value.GetStringValue() case "host.arch": session.HostArch = value.GetStringValue() + case "wsl.version": + session.WSLVersion = value.GetStringValue() } } @@ -305,6 +308,18 @@ func (p *CCOtelProcessor) parseLogRecord(lr *logsv1.LogRecord) *model.CCOtelEven event.Error = value.GetStringValue() case "prompt_length": event.PromptLength = int(value.GetIntValue()) + case "prompt": + event.Prompt = value.GetStringValue() + case "tool_parameters": + // tool_parameters comes as a JSON string, parse it into map + if jsonStr := value.GetStringValue(); jsonStr != "" { + var params map[string]interface{} + if err := json.Unmarshal([]byte(jsonStr), ¶ms); err == nil { + event.ToolParameters = params + } else { + slog.Debug("CCOtel: Failed to parse tool_parameters", "error", err) + } + } case "status_code": event.StatusCode = int(value.GetIntValue()) case "attempt": diff --git a/model/ccotel_types.go b/model/ccotel_types.go index 469dc49..4bd5d48 100644 --- a/model/ccotel_types.go +++ b/model/ccotel_types.go @@ -2,11 +2,11 @@ package model // CCOtelRequest is the main request to POST /api/v1/cc/otel type CCOtelRequest struct { - Host string `json:"host"` - Project string `json:"project"` - Session *CCOtelSession `json:"session"` - Events []CCOtelEvent `json:"events,omitempty"` - Metrics []CCOtelMetric `json:"metrics,omitempty"` + Host string `json:"host"` + Project string `json:"project"` + Session *CCOtelSession `json:"session"` + Events []CCOtelEvent `json:"events,omitempty"` + Metrics []CCOtelMetric `json:"metrics,omitempty"` } // CCOtelSession represents session data for Claude Code OTEL tracking @@ -20,6 +20,7 @@ type CCOtelSession struct { OSType string `json:"osType"` OSVersion string `json:"osVersion"` HostArch string `json:"hostArch"` + WSLVersion string `json:"wslVersion,omitempty"` StartedAt int64 `json:"startedAt"` EndedAt int64 `json:"endedAt,omitempty"` ActiveTimeSeconds int `json:"activeTimeSeconds,omitempty"` @@ -55,6 +56,7 @@ type CCOtelEvent struct { Source string `json:"source,omitempty"` Error string `json:"error,omitempty"` PromptLength int `json:"promptLength,omitempty"` + Prompt string `json:"prompt,omitempty"` ToolParameters map[string]interface{} `json:"toolParameters,omitempty"` StatusCode int `json:"statusCode,omitempty"` Attempt int `json:"attempt,omitempty"` @@ -86,14 +88,14 @@ type CCOtelResponse struct { // Claude Code OTEL metric types const ( - CCMetricSessionCount = "session_count" - CCMetricLinesOfCodeCount = "lines_of_code_count" - CCMetricPullRequestCount = "pull_request_count" - CCMetricCommitCount = "commit_count" - CCMetricCostUsage = "cost_usage" - CCMetricTokenUsage = "token_usage" + CCMetricSessionCount = "session_count" + CCMetricLinesOfCodeCount = "lines_of_code_count" + CCMetricPullRequestCount = "pull_request_count" + CCMetricCommitCount = "commit_count" + CCMetricCostUsage = "cost_usage" + CCMetricTokenUsage = "token_usage" CCMetricCodeEditToolDecision = "code_edit_tool_decision" - CCMetricActiveTimeTotal = "active_time_total" + CCMetricActiveTimeTotal = "active_time_total" ) // Claude Code OTEL event types