
Installation
Install both the Netra SDK and Milvus:pip install netra-sdk pymilvus
npm install netra-sdk @zilliz/milvus2-sdk-node
Usage
Initialize the Netra SDK to automatically trace all Milvus operations:from netra import Netra
from pymilvus import MilvusClient
import os
# Initialize Netra
Netra.init(
headers=f"x-api-key={os.environ.get('NETRA_API_KEY')}",
trace_content=True
)
# Create Milvus client - automatically traced
client = MilvusClient(
uri=os.environ.get('MILVUS_URI'),
token=os.environ.get('MILVUS_TOKEN')
)
# Create collection
client.create_collection(
collection_name="my_collection",
dimension=384
)
import { Netra } from "netra-sdk";
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
// Initialize Netra
await Netra.init({
headers: `x-api-key=${process.env.NETRA_API_KEY}`,
traceContent: true
});
// Create Milvus client - automatically traced
const client = new MilvusClient({
address: process.env.MILVUS_ADDRESS,
token: process.env.MILVUS_TOKEN
});
// Create collection
await client.createCollection({
collection_name: "my_collection",
dimension: 384
});
Collection Operations
Trace collection creation and management:from netra.decorators import task
from netra import SpanWrapper
@task()
def create_collection(client: MilvusClient, name: str, dimension: int):
span = SpanWrapper("milvus-create-collection", {
"collection.name": name,
"vector.dimension": dimension
}).start()
client.create_collection(
collection_name=name,
dimension=dimension
)
span.end()
import { task, SpanWrapper } from "netra-sdk";
@task()
async function createCollection(client: MilvusClient, name: string, dimension: number) {
const span = new SpanWrapper("milvus-create-collection", {
"collection.name": name,
"vector.dimension": dimension
}).start();
await client.createCollection({
collection_name: name,
dimension: dimension
});
span.end();
}
Vector Insertion
Trace entity insertions:from netra.decorators import task
from netra import SpanWrapper, ActionModel
@task()
def insert_vectors(client: MilvusClient, collection: str, data: list):
span = SpanWrapper("milvus-insert", {
"collection": collection,
"entities.count": len(data)
}).start()
result = client.insert(
collection_name=collection,
data=data
)
span.set_action([ActionModel(
action="insert",
action_type="database.insert",
success=True,
affected_records=[{"id": str(d["id"])} for d in data],
metadata={"collection": collection, "inserted": result["insert_count"]}
)])
span.set_attribute("insert.count", result["insert_count"])
span.end()
return result
import { task, SpanWrapper, ActionModel } from "netra-sdk";
@task()
async function insertVectors(client: MilvusClient, collection: string, data: any[]) {
const span = new SpanWrapper("milvus-insert", {
"collection": collection,
"entities.count": data.length
}).start();
const result = await client.insert({
collection_name: collection,
data: data
});
span.setAction([{
action: "insert",
action_type: "database.insert",
success: true,
affected_records: data.map(d => ({ id: String(d.id) })),
metadata: { collection, inserted: result.insert_cnt }
}]);
span.setAttribute("insert.count", result.insert_cnt);
span.end();
return result;
}
Vector Search
Trace similarity searches:from netra.decorators import workflow
from netra import SpanWrapper
@workflow()
def search_vectors(client: MilvusClient, collection: str, query: list[float], limit: int = 5):
span = SpanWrapper("milvus-search", {
"collection": collection,
"query.dimension": len(query),
"limit": limit
}).start()
results = client.search(
collection_name=collection,
data=[query],
limit=limit
)
span.set_attribute("results.count", len(results[0]))
span.end()
return results
import { workflow, SpanWrapper } from "netra-sdk";
@workflow()
async function searchVectors(client: MilvusClient, collection: string, query: number[], limit: number = 5) {
const span = new SpanWrapper("milvus-search", {
"collection": collection,
"query.dimension": query.length,
"limit": limit
}).start();
const results = await client.search({
collection_name: collection,
data: [query],
limit: limit
});
span.setAttribute("results.count", results[0]?.length || 0);
span.end();
return results;
}
Filtered Search
Trace searches with filters:from netra.decorators import task
from netra import SpanWrapper
@task()
def filter_search(client: MilvusClient, collection: str, query: list[float], filter: str):
span = SpanWrapper("milvus-filter-search", {
"collection": collection,
"filter": filter
}).start()
results = client.search(
collection_name=collection,
data=[query],
filter=filter,
limit=10
)
span.set_attribute("results.count", len(results[0]))
span.end()
return results
import { task, SpanWrapper } from "netra-sdk";
@task()
async function filterSearch(client: MilvusClient, collection: string, query: number[], filter: string) {
const span = new SpanWrapper("milvus-filter-search", {
"collection": collection,
"filter": filter
}).start();
const results = await client.search({
collection_name: collection,
data: [query],
filter: filter,
limit: 10
});
span.setAttribute("results.count", results[0]?.length || 0);
span.end();
return results;
}
Next Steps
- Quick Start Guide - Complete setup and configuration
- Decorators - Add custom tracing with
@workflow,@agent, and@taskdecorators - Milvus Documentation - Official Milvus documentation
