Skip to content

Commit cd2d0f2

Browse files
Dev AgentQinYuuuu
authored andcommitted
Xnet csghub sdk
1 parent faf9510 commit cd2d0f2

File tree

4 files changed

+148
-8
lines changed

4 files changed

+148
-8
lines changed

common/log/context_handler.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package log
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log/slog"
7+
"opencsg.com/csghub-server/common/utils/trace"
8+
"path/filepath"
9+
"runtime"
10+
)
11+
12+
// ContextHandler is a slog.Handler that adds trace ID and session ID to every log record.
13+
type ContextHandler struct {
14+
slog.Handler
15+
}
16+
17+
// Handle adds the trace ID and session ID to the log record before passing it to the underlying handler.
18+
func (h *ContextHandler) Handle(ctx context.Context, r slog.Record) error {
19+
if traceID, _ := trace.GetTraceIDFromContext(ctx); traceID != "" {
20+
r.AddAttrs(slog.String("trace_id", traceID))
21+
}
22+
if sessionID := trace.GetSessionIDFromContext(ctx); sessionID != "" {
23+
r.AddAttrs(slog.String("xnet_session_id", sessionID))
24+
}
25+
26+
if r.Level == slog.LevelError || r.Level == slog.LevelDebug {
27+
if r.PC != 0 {
28+
fs := runtime.CallersFrames([]uintptr{r.PC})
29+
f, _ := fs.Next()
30+
shortFile := filepath.Base(f.File)
31+
r.AddAttrs(slog.String("source", fmt.Sprintf("%s:%d", shortFile, f.Line)))
32+
}
33+
}
34+
35+
return h.Handler.Handle(ctx, r)
36+
}

common/log/context_handler_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package log
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"encoding/json"
7+
"log/slog"
8+
"os"
9+
"testing"
10+
11+
"github.com/stretchr/testify/require"
12+
"go.opentelemetry.io/otel/trace"
13+
csgtrace "opencsg.com/csghub-server/common/utils/trace"
14+
)
15+
16+
func TestContextHandler_Handle(t *testing.T) {
17+
// Setup buffer to capture logs
18+
var buf bytes.Buffer
19+
// Use JSONHandler to easily parse output
20+
jsonHandler := slog.NewJSONHandler(&buf, &slog.HandlerOptions{
21+
// Remove time to make testing easier or just ignore it in assertion
22+
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
23+
if a.Key == slog.TimeKey {
24+
return slog.Attr{}
25+
}
26+
return a
27+
},
28+
})
29+
30+
h := &ContextHandler{Handler: jsonHandler}
31+
logger := slog.New(h)
32+
33+
// Case 1: Context with TraceID (via OTEL) and SessionID
34+
ctx := context.Background()
35+
36+
// Generate a valid TraceID and SpanID for OTEL
37+
traceIDStr := "4bf92f3577b34da6a3ce929d0e0e4736"
38+
traceID, err := trace.TraceIDFromHex(traceIDStr)
39+
require.NoError(t, err)
40+
41+
spanIDStr := "00f067aa0ba902b7"
42+
spanID, err := trace.SpanIDFromHex(spanIDStr)
43+
require.NoError(t, err)
44+
45+
spanCtx := trace.NewSpanContext(trace.SpanContextConfig{
46+
TraceID: traceID,
47+
SpanID: spanID,
48+
TraceFlags: trace.FlagsSampled,
49+
})
50+
// Inject SpanContext into context
51+
ctx = trace.ContextWithSpanContext(ctx, spanCtx)
52+
53+
// Inject SessionID
54+
sessionID := "sess-12345"
55+
ctx = csgtrace.SetSessionIDInContext(ctx, sessionID)
56+
57+
// Log something
58+
logger.ErrorContext(ctx, "test message")
59+
60+
// Parse result
61+
var result map[string]interface{}
62+
err = json.Unmarshal(buf.Bytes(), &result)
63+
require.NoError(t, err)
64+
65+
// Verify fields
66+
require.Equal(t, "test message", result["msg"])
67+
require.Equal(t, traceIDStr, result["trace_id"])
68+
require.Equal(t, sessionID, result["xnet_session_id"])
69+
70+
// Verify source
71+
source, ok := result["source"].(string)
72+
require.True(t, ok, "source field should be present and string")
73+
74+
// Check that source contains the filename
75+
// Since we are running the test, the source file should be this file.
76+
require.Contains(t, source, "context_handler_test.go")
77+
78+
wd, _ := os.Getwd()
79+
t.Logf("Working Dir: %s", wd)
80+
t.Logf("Source Logged: %s", source)
81+
}

component/git_http.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,23 @@ func (c *gitHTTPComponentImpl) lfsBatchDownloadInfo(ctx context.Context, req typ
219219
Pointer: obj,
220220
}
221221
reqParams := make(url.Values)
222-
url, err := c.s3Client.PresignedGetObject(ctx, c.config.S3.Bucket, objectKey, types.OssFileExpire, reqParams)
223-
if err != nil {
224-
objs = append(objs, &types.ObjectResponse{
225-
Error: &types.ObjectError{},
226-
})
227-
continue
222+
var url *url.URL
223+
if repo.XnetEnabled {
224+
url, err = c.xnetClient.PresignedGetObject(ctx, objectKey, types.OssFileExpire, reqParams)
225+
if err != nil {
226+
objs = append(objs, &types.ObjectResponse{
227+
Error: &types.ObjectError{},
228+
})
229+
continue
230+
}
231+
} else {
232+
url, err = c.s3Client.PresignedGetObject(ctx, c.config.S3.Bucket, objectKey, types.OssFileExpire, reqParams)
233+
if err != nil {
234+
objs = append(objs, &types.ObjectResponse{
235+
Error: &types.ObjectError{},
236+
})
237+
continue
238+
}
228239
}
229240
resp.Actions["download"] = &types.Link{Href: url.String(), Header: map[string]any{}}
230241
objs = append(objs, resp)
@@ -250,11 +261,22 @@ func (c *gitHTTPComponentImpl) lfsBatchUploadInfo(ctx context.Context, req types
250261
}
251262

252263
useMultipart := slices.Contains(req.Transfers, "multipart")
253-
254-
if useMultipart {
264+
useXnet := false
265+
transfer = "basic"
266+
if repo.XnetEnabled && slices.Contains(req.Transfers, "xet") {
267+
transfer = "xet"
268+
useXnet = true
269+
} else if useMultipart {
255270
transfer = "multipart"
256271
}
257272

273+
if useXnet {
274+
header["X-Xet-Cas-Url"] = c.config.Xnet.Endpoint
275+
header["X-Xet-Access-Token"] = "nosniff"
276+
header["X-Xet-Token-Expiration"] = ""
277+
header["X-Xet-Session-Id"] = "1"
278+
}
279+
258280
for _, obj := range req.Objects {
259281
// for existing lfs files, return pointer only and no action,
260282
// this is the expeted format when file exists and doesn't

component/git_http_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ func TestGitHTTPComponent_Batch(t *testing.T) {
213213
operation: types.LFSBatchUpload,
214214
hasWriteAccess: true,
215215
resp: &types.BatchResponse{
216+
Transfer: "basic",
216217
Objects: []*types.ObjectResponse{
217218
{
218219
Pointer: types.Pointer{Oid: notExistOID, Size: 100},

0 commit comments

Comments
 (0)