diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/_description.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/_description.md new file mode 100644 index 000000000..531945aaf --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/_description.md @@ -0,0 +1 @@ +Attach a tracing ID to a request so it appears in the audit log entry for that request. diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/bash.sh b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/bash.sh new file mode 100644 index 000000000..1a9caf356 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/bash.sh @@ -0,0 +1,3 @@ +curl -X GET http://localhost:6333/collections \ + --header 'api-key: your_api_key_here' \ + --header 'x-request-id: my-trace-id' diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/csharp.cs b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/csharp.cs new file mode 100644 index 000000000..ae1433361 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/csharp.cs @@ -0,0 +1,14 @@ +using Qdrant.Client; + +public class Snippet +{ + public static async Task Run() + { + // @hide-start + var client = new QdrantClient("localhost", 6334); + // @hide-end + + using (RequestHeaders.Use("x-request-id", "my-trace-id")) + await client.ListCollectionsAsync(); + } +} diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/bash.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/bash.md new file mode 100644 index 000000000..2c90b824b --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/bash.md @@ -0,0 +1,5 @@ +```bash +curl -X GET http://localhost:6333/collections \ + --header 'api-key: your_api_key_here' \ + --header 'x-request-id: my-trace-id' +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/csharp.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/csharp.md new file mode 100644 index 000000000..ec8b59f41 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/csharp.md @@ -0,0 +1,6 @@ +```csharp +using Qdrant.Client; + +using (RequestHeaders.Use("x-request-id", "my-trace-id")) + await client.ListCollectionsAsync(); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/go.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/go.md new file mode 100644 index 000000000..7ff1fb045 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/go.md @@ -0,0 +1,10 @@ +```go +import ( + "context" + + "github.com/qdrant/go-client/qdrant" +) + +ctx := qdrant.WithHeader(context.Background(), "x-request-id", "my-trace-id") +client.ListCollections(ctx) +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/java.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/java.md new file mode 100644 index 000000000..55f7b23b6 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/java.md @@ -0,0 +1,9 @@ +```java +import io.qdrant.client.QdrantClient; +import io.qdrant.client.QdrantGrpcClient; +import io.qdrant.client.RequestHeaders; +import io.grpc.Context; + +Context ctx = RequestHeaders.withHeader(Context.current(), "x-request-id", "my-trace-id"); +ctx.run(() -> client.listCollectionsAsync()); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/python.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/python.md new file mode 100644 index 000000000..78fd98c3b --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/python.md @@ -0,0 +1,6 @@ +```python +from qdrant_client import QdrantClient, headers + +with headers({"x-request-id": "my-trace-id"}): + client.get_collections() +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/rust.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/rust.md new file mode 100644 index 000000000..069f2ed3c --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/rust.md @@ -0,0 +1,8 @@ +```rust +use qdrant_client::Qdrant; + +client + .with_header("x-request-id", "my-trace-id") + .list_collections() + .await?; +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/typescript.md b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/typescript.md new file mode 100644 index 000000000..aba388635 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/generated/typescript.md @@ -0,0 +1,7 @@ +```typescript +import { QdrantClient, withHeaders } from "@qdrant/js-client-rest"; + +const result = await withHeaders({ "x-request-id": "my-trace-id" }, () => + client.getCollections() +); +``` diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/go.go b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/go.go new file mode 100644 index 000000000..3242566f2 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/go.go @@ -0,0 +1,17 @@ +package snippet + +import ( + "context" + + "github.com/qdrant/go-client/qdrant" +) + +func Main() { + // @hide-start + client, err := qdrant.NewClient(&qdrant.Config{Host: "localhost", Port: 6334}) + if err != nil { panic(err) } + // @hide-end + + ctx := qdrant.WithHeader(context.Background(), "x-request-id", "my-trace-id") + client.ListCollections(ctx) +} diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/java.java b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/java.java new file mode 100644 index 000000000..09e00c9b8 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/java.java @@ -0,0 +1,18 @@ +package com.example.snippets_amalgamation; + +import io.qdrant.client.QdrantClient; +import io.qdrant.client.QdrantGrpcClient; +import io.qdrant.client.RequestHeaders; +import io.grpc.Context; + +public class Snippet { + public static void run() throws Exception { + // @hide-start + QdrantClient client = new QdrantClient( + QdrantGrpcClient.newBuilder("localhost", 6334, false).build()); + // @hide-end + + Context ctx = RequestHeaders.withHeader(Context.current(), "x-request-id", "my-trace-id"); + ctx.run(() -> client.listCollectionsAsync()); + } +} diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/python.py b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/python.py new file mode 100644 index 000000000..2c6557d84 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/python.py @@ -0,0 +1,6 @@ +from qdrant_client import QdrantClient, headers + +client = QdrantClient(url="http://localhost:6333") # @hide + +with headers({"x-request-id": "my-trace-id"}): + client.get_collections() diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/rust.rs b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/rust.rs new file mode 100644 index 000000000..7e678de4f --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/rust.rs @@ -0,0 +1,12 @@ +use qdrant_client::Qdrant; + +pub async fn main() -> anyhow::Result<()> { + let client = Qdrant::from_url("http://localhost:6334").build()?; // @hide + + client + .with_header("x-request-id", "my-trace-id") + .list_collections() + .await?; + + Ok(()) +} diff --git a/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/typescript.ts b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/typescript.ts new file mode 100644 index 000000000..695fbeb85 --- /dev/null +++ b/qdrant-landing/content/documentation/headless/snippets/audit-tracing-id/simple/typescript.ts @@ -0,0 +1,7 @@ +import { QdrantClient, withHeaders } from "@qdrant/js-client-rest"; + +const client = new QdrantClient({ host: "localhost", port: 6333 }); // @hide + +const result = await withHeaders({ "x-request-id": "my-trace-id" }, () => + client.getCollections() +); diff --git a/qdrant-landing/content/documentation/security.md b/qdrant-landing/content/documentation/security.md index 07843b081..b685dd8a8 100644 --- a/qdrant-landing/content/documentation/security.md +++ b/qdrant-landing/content/documentation/security.md @@ -487,6 +487,16 @@ By default, audit logs are rotated daily, and the seven most recent log files ar +### Tracing IDs + +*Available as of v1.18.0* + +You can attach a tracing ID to individual requests. When audit logging is enabled, Qdrant includes the tracing ID in the audit log entry, enabling the correlation of client-side operations with their corresponding log entries. + +Qdrant reads the tracing ID from the first matching header in the following order: `x-request-id`, `x-tracing-id`, `traceparent`. Tracing IDs longer than 256 characters are truncated. + +{{< code-snippet path="/documentation/headless/snippets/audit-tracing-id/simple/" >}} + ## Network Bind By default, a custom Qdrant deployment binds to all network interfaces. Your