Skip to main content

Installation

Install both the Netra SDK and Marqo:
pip install netra-sdk marqo

Usage

Initialize the Netra SDK to automatically trace all Marqo operations:
from netra import Netra
import marqo
import os

# Initialize Netra
Netra.init(
    headers=f"x-api-key={os.environ.get('NETRA_API_KEY')}",
    trace_content=True
)

# Create Marqo client - automatically traced
mq = marqo.Client(
    url=os.environ.get('MARQO_URL'),
    api_key=os.environ.get('MARQO_API_KEY')
)

# Create index
mq.create_index("my-index")

# Add documents
mq.index("my-index").add_documents([
    {"title": "Document 1", "content": "Content here"}
])

Index Operations

Trace index creation and management:
from netra import task, SpanWrapper

@task()
def create_index(mq, index_name: str):
    span = SpanWrapper("marqo-create-index", {
        "index.name": index_name
    }).start()
    
    mq.create_index(
        index_name,
        model="hf/e5-base-v2"
    )
    
    span.end()

Document Insertion

Trace document additions:
from netra import task, SpanWrapper, ActionModel

@task()
def add_documents(mq, index_name: str, documents: list):
    span = SpanWrapper("marqo-add-documents", {
        "index.name": index_name,
        "documents.count": len(documents)
    }).start()
    
    result = mq.index(index_name).add_documents(documents)
    
    span.set_action([ActionModel(
        action="insert",
        action_type="database.insert",
        success=result["status"] == "succeeded",
        affected_records=[{"id": d.get("id") or d.get("_id")} for d in documents],
        metadata={"index": index_name}
    )])
    span.set_attribute("status", result["status"])
    span.end()
    
    return result
Trace text-based searches:
from netra import workflow, SpanWrapper

@workflow()
def search_documents(mq, index_name: str, query: str, limit: int = 5):
    span = SpanWrapper("marqo-search", {
        "index.name": index_name,
        "query": query,
        "limit": limit
    }).start()
    
    results = mq.index(index_name).search(
        q=query,
        limit=limit
    )
    
    span.set_attribute("results.count", len(results["hits"]))
    span.end()
    
    return results
Trace image and text searches:
from netra import task, SpanWrapper

@task()
def multimodal_search(mq, index_name: str, query: dict):
    span = SpanWrapper("marqo-multimodal-search", {
        "index.name": index_name
    }).start()
    
    results = mq.index(index_name).search(
        q=query,
        searchable_attributes=["title", "content", "image_url"]
    )
    
    span.set_attribute("results.count", len(results["hits"]))
    span.end()
    
    return results
Trace searches with filters:
from netra import task, SpanWrapper

@task()
def filter_search(mq, index_name: str, query: str, filter: str):
    span = SpanWrapper("marqo-filter-search", {
        "index.name": index_name,
        "filter": filter
    }).start()
    
    results = mq.index(index_name).search(
        q=query,
        filter_string=filter
    )
    
    span.set_attribute("results.count", len(results["hits"]))
    span.end()
    
    return results

Next Steps

Last modified on January 30, 2026