Pass arbitrary custom dimensions through to span attributes.
properties attaches arbitrary key/value pairs to a span. Values pass through as-is, with no namespace prefix, so they stay readable by other OTel backends after a switch.
Property values keep their type so downstream filters and aggregates work correctly:
Value
Span sees
Why it matters
"foo" (str)
string
42 (int)
int
dashboard can experiment_id > 100
3.14 (float)
float
True (bool)
bool
dashboard can is_premium = true
[1, 2, 3] (homogeneous list)
array
{"nested": "x"} or [1, "two"] (dict / mixed)
JSON string (fallback)
OTel doesn’t natively support these
Don’t put gen_ai.*, input.value, or output.value keys in properties. The SDK-managed kwargs are written after properties and will overwrite them. Use the dedicated kwargs (user_id, model, provider, input, output, convo_id) instead.
User, conversation, model, provider, input, and output have dedicated kwargs, because the dashboard has filters and breakdowns built for them. Everything else goes in properties: feature flags, experiment buckets, latency, retrieved-chunk count. Each one becomes a generic filter and breakdown dimension.A property that proves widely useful can get promoted to a first-class column. Until then, anything in properties lands in spans.attributes as JSONB, queryable from custom dashboards.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Bento","description":"Production infrastructure for AI agents. Monitor what runs. Improve what fails. Compound learnings.","colors":{"primary":"#FF3C00","light":"#FF7A4D","dark":"#C23D0F"},"logo":{"light":"https://mintcdn.com/bentolabs-67c07c24/UR3oVTg-dFSkd4Qv/logo/light.svg?fit=max\u0026auto=format\u0026n=UR3oVTg-dFSkd4Qv\u0026q=85\u0026s=52d59445f69fca8e14170d9f18f24489","dark":"https://mintcdn.com/bentolabs-67c07c24/UR3oVTg-dFSkd4Qv/logo/dark.svg?fit=max\u0026auto=format\u0026n=UR3oVTg-dFSkd4Qv\u0026q=85\u0026s=cb9f386a99e01805f4d0b2e6afb4eee9","href":"https://bentolabs.ai"},"favicon":"https://mintcdn.com/bentolabs-67c07c24/UR3oVTg-dFSkd4Qv/favicon.svg?fit=max\u0026auto=format\u0026n=UR3oVTg-dFSkd4Qv\u0026q=85\u0026s=7af1b6c525f2fa0a76075cfae72bdf22","appearance":{"default":"dark"},"navbar":{"links":[{"icon":"clock-rotate-left","href":"/changelog","label":"Changelog"},{"icon":"github","href":"https://github.com/BentoLabs-ai","label":"GitHub"}],"primary":{"type":"button","label":"Dashboard","href":"https://platform.bentolabs.ai"}},"footer":{"socials":{"x":"https://x.com/bentolabsai","github":"https://github.com/BentoLabs-ai","linkedin":"https://www.linkedin.com/company/bentolabs-ai"},"links":[{"header":"Product","items":[{"label":"Dashboard","href":"https://platform.bentolabs.ai"},{"label":"Website","href":"https://bentolabs.ai"}]},{"header":"Developers","items":[{"label":"GitHub","href":"https://github.com/BentoLabs-ai"},{"label":"Python SDK","href":"/python/installation"},{"label":"TypeScript SDK","href":"/typescript"},{"label":"CLI","href":"/cli/installation"}]},{"header":"Company","items":[{"label":"Support","href":"mailto:support@bentolabs.ai"}]}]},"seo":{"metatags":{"title":"Bento Documentation","description":"Production infrastructure for AI agents. SDK docs, quickstart, and reference for the Bento platform.","keywords":"Bento, BentoLabs, AI agents, AI infrastructure, agent traces, agent monitoring, agent evaluations, signals, OpenTelemetry, Python SDK, gen_ai","author":"BentoLabs","og:type":"website","og:site_name":"Bento Docs","og:title":"Bento Documentation","og:description":"Production infrastructure for AI agents. Monitor what runs. Improve what fails. Compound learnings.","og:url":"https://docs.bentolabs.ai","og:locale":"en_US","twitter:card":"summary","twitter:site":"@bentolabsai","twitter:title":"Bento Documentation","twitter:description":"Production infrastructure for AI agents. SDK docs, quickstart, and reference for the Bento platform.","robots":"index, follow","googlebot":"index, follow"},"indexing":"navigable"},"fonts":{"heading":{"family":"Inter"},"body":{"family":"Inter"}},"contextual":{"options":["copy","view","assistant","claude","chatgpt","perplexity","add-mcp","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bentolabs-67c07c24","hasAudioNarration":false,"actualSubdomain":"bentolabs-67c07c24","customDomains":["docs.bentolabs.ai"],"gitSource":{"type":"github","owner":"bentolabs-ai","repo":"docs","deployBranch":"main","isPrivate":false,"contentDirectory":"","mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a21dd80a5fe930653fc0085","collectionId":"df42cf17-99f6-410f-a873-850ed68eb3f1","schemaVersion":"v2"},"feedback":{"thumbs":true,"edits":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6a21dd80a5fe930653fc0085:success","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"Get started","count":15},{"language":"default","tag":"CLI","count":13},{"language":"default","tag":"Python SDK","count":9},{"language":"default","tag":"Resources","count":8},{"language":"default","tag":"Concepts","count":5},{"language":"default","tag":"Advanced","count":4},{"language":"default","tag":"Overview","count":3},{"language":"default","tag":"Workspace \u0026 sources","count":2},{"language":"default","tag":"Migrations","count":2},{"language":"default","tag":"Manual tracking","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"python/properties","slug":"/python/properties","pageMetadata":{"title":"Properties","description":"Pass arbitrary custom dimensions through to span attributes.","icon":"sliders","href":"/python/properties"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Pass arbitrary custom dimensions through to span attributes.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`properties`}),` attaches arbitrary key/value pairs to a span. Values pass through as-is, with no namespace prefix, so they stay readable by other OTel backends after a switch.`]}),`\n`,_jsx(Heading,{level:`2`,id:`usage`,children:`Usage`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` bentolabs_sdk.analytics `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` bento`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`bento.track_ai(`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` event`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"search\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` properties`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"feature\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"semantic_search\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"experiment\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"v3\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ranking_model\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ce-3\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` user_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"u1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`properties`}),` is also accepted by:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`bento.begin(properties=...)`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`interaction.update(properties=...)`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`interaction.finish(properties=...)`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`bento.tool_span(name, properties=...)`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`interaction.tool_span(name, properties=...)`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`type-fidelity`,children:`Type fidelity`}),`\n`,_jsx(_components.p,{children:`Property values keep their type so downstream filters and aggregates work correctly:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Value`}),_jsx(_components.th,{children:`Span sees`}),_jsx(_components.th,{children:`Why it matters`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\"foo\"`}),` (str)`]}),_jsx(_components.td,{children:`string`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`42`}),` (int)`]}),_jsx(_components.td,{children:`int`}),_jsxs(_components.td,{children:[`dashboard can `,_jsx(_components.code,{children:`experiment_id > 100`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`3.14`}),` (float)`]}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`True`}),` (bool)`]}),_jsx(_components.td,{children:`bool`}),_jsxs(_components.td,{children:[`dashboard can `,_jsx(_components.code,{children:`is_premium = true`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`[1, 2, 3]`}),` (homogeneous list)`]}),_jsx(_components.td,{children:`array`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`{\"nested\": \"x\"}`}),` or `,_jsx(_components.code,{children:`[1, \"two\"]`}),` (dict / mixed)`]}),_jsx(_components.td,{children:`JSON string (fallback)`}),_jsx(_components.td,{children:`OTel doesn’t natively support these`})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Don’t put `,_jsx(_components.code,{children:`gen_ai.*`}),`, `,_jsx(_components.code,{children:`input.value`}),`, or `,_jsx(_components.code,{children:`output.value`}),` keys in `,_jsx(_components.code,{children:`properties`}),`. The SDK-managed kwargs are written `,_jsx(_components.em,{children:`after`}),` properties and will overwrite them. Use the dedicated kwargs (`,_jsx(_components.code,{children:`user_id`}),`, `,_jsx(_components.code,{children:`model`}),`, `,_jsx(_components.code,{children:`provider`}),`, `,_jsx(_components.code,{children:`input`}),`, `,_jsx(_components.code,{children:`output`}),`, `,_jsx(_components.code,{children:`convo_id`}),`) instead.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`properties-vs-built-in-kwargs`,children:`Properties vs built-in kwargs`}),`\n`,_jsxs(_components.p,{children:[`User, conversation, model, provider, input, and output have dedicated kwargs, because the dashboard has filters and breakdowns built for them. Everything else goes in `,_jsx(_components.code,{children:`properties`}),`: feature flags, experiment buckets, latency, retrieved-chunk count. Each one becomes a generic filter and breakdown dimension.`]}),`\n`,_jsxs(_components.p,{children:[`A property that proves widely useful can get promoted to a first-class column. Until then, anything in `,_jsx(_components.code,{children:`properties`}),` lands in `,_jsx(_components.code,{children:`spans.attributes`}),` as JSONB, queryable from custom dashboards.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Properties","description":"Pass arbitrary custom dimensions through to span attributes.","icon":"sliders","href":"/python/properties"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Usage","slug":"usage","depth":2,"children":[]},{"title":"Type fidelity","slug":"type-fidelity","depth":2,"children":[]},{"title":"Properties vs built-in kwargs","slug":"properties-vs-built-in-kwargs","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"bentolabs-67c07c24","siteName":"Bento","title":"Bento Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-05-30T01:44:30.925Z","originalFileLocation":"python/properties.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Pass arbitrary custom dimensions through to span attributes.\">\u003cmeta data-mint-head name=\"keywords\" content=\"Bento, BentoLabs, AI agents, AI infrastructure, agent traces, agent monitoring, agent evaluations, signals, OpenTelemetry, Python SDK, gen_ai\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bento\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Bento Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Production infrastructure for AI agents. Monitor what runs. Improve what fails. Compound learnings.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bento Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.bentolabs.ai/python/properties\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bentolabs-67c07c24.mintlify.app/_mintlify/api/og/v2?division=Manual+tracking\u0026amp;title=Properties\u0026amp;description=Pass+arbitrary+custom+dimensions+through+to+span+attributes.\u0026amp;theme=7e776a1e7779628f30b79d1e\u0026amp;signature=69ae2b0d541955f1a87e43402205c8f4492cab4942461c1a7ae74a4d1197068b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Bento Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Production infrastructure for AI agents. SDK docs, quickstart, and reference for the Bento platform.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bentolabs-67c07c24.mintlify.app/_mintlify/api/og/v2?division=Manual+tracking\u0026amp;title=Properties\u0026amp;description=Pass+arbitrary+custom+dimensions+through+to+span+attributes.\u0026amp;theme=7e776a1e7779628f30b79d1e\u0026amp;signature=69ae2b0d541955f1a87e43402205c8f4492cab4942461c1a7ae74a4d1197068b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/bentolabs-67c07c24/5y0pyf96-lCjMzMa/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bento\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF3C00\">\u003cmeta data-mint-head name=\"og:locale\" content=\"en_US\">\u003cmeta data-mint-head name=\"author\" content=\"BentoLabs\">\u003cmeta data-mint-head name=\"googlebot\" content=\"index, follow\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.bentolabs.ai/python/properties\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/python/properties.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.bentolabs.ai/#organization\",\"name\":\"Bento\",\"url\":\"https://docs.bentolabs.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bentolabs-67c07c24/UR3oVTg-dFSkd4Qv/logo/light.svg?fit=max\u0026auto=format\u0026n=UR3oVTg-dFSkd4Qv\u0026q=85\u0026s=52d59445f69fca8e14170d9f18f24489\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.bentolabs.ai#website\",\"name\":\"Bento\",\"url\":\"https://docs.bentolabs.ai\",\"publisher\":{\"@id\":\"https://docs.bentolabs.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.bentolabs.ai/python/properties#webpage\",\"url\":\"https://docs.bentolabs.ai/python/properties\",\"name\":\"Properties\",\"description\":\"Pass arbitrary custom dimensions through to span attributes.\",\"dateModified\":\"2026-05-30T01:44:30.925Z\",\"isPartOf\":{\"@id\":\"https://docs.bentolabs.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.bentolabs.ai/python/properties#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.bentolabs.ai/python/properties#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Manual tracking\",\"item\":\"https://docs.bentolabs.ai/python/track-ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Properties\",\"item\":\"https://docs.bentolabs.ai/python/properties\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.bentolabs.ai/python/properties#article\",\"headline\":\"Properties\",\"name\":\"Properties\",\"description\":\"Pass arbitrary custom dimensions through to span attributes.\",\"url\":\"https://docs.bentolabs.ai/python/properties\",\"mainEntityOfPage\":{\"@id\":\"https://docs.bentolabs.ai/python/properties#webpage\"},\"dateModified\":\"2026-05-30T01:44:30.925Z\",\"publisher\":{\"@id\":\"https://docs.bentolabs.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.bentolabs.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bento\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bento","nav":{"global":null,"tabs":[{"tab":"Get started","icon":"rocket","pages":[{"title":"Get started","href":""}]},{"tab":"Python SDK","icon":"python","groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"Installation","icon":"download","href":"/python/installation"},{"title":"Configuration","icon":"gear","href":"/python/configuration"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Google ADK","icon":"google","href":"/python/integrations"}]},{"group":"Manual tracking","icon":"paper-plane","pages":[{"title":"Tracking events","description":"Wrap any LLM or tool call with bento.track_ai. Manual events for SDKs without an integration.","icon":"code","href":"/python/track-ai"},{"title":"Properties","icon":"sliders","href":"/python/properties"}]},{"group":"Advanced","icon":"screwdriver-wrench","pages":[{"title":"Trajectories","description":"Group multi-step work into a single trace. Advanced, most apps don't need this.","icon":"diagram-project","href":"/python/trajectories"},{"title":"Identity helpers","icon":"user-tag","href":"/python/identity"},{"title":"OTel transport","icon":"cube","href":"/python/otel-transport"},{"title":"Threading model","icon":"microchip","href":"/python/threading-model"}]}]},{"tab":"TypeScript SDK","icon":"js","pages":[{"title":"TypeScript SDK","href":"/typescript"}]},{"tab":"CLI","icon":"terminal","pages":[{"title":"CLI","href":"/cli/overview"}]}]},"title":"Bento Documentation","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":[],"chunks":[]}