[{"data":1,"prerenderedAt":783},["ShallowReactive",2],{"navigation":3,"\u002Freference\u002Fobservability":189,"\u002Freference\u002Fobservability-surround":778},[4,34,60,116,137,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":33},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,18,23,28],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":5,"path":16,"stem":17,"icon":6},"\u002Fgetting-started\u002Fgetting-started","1.getting-started\u002F2.getting-started",{"title":19,"path":20,"stem":21,"icon":22},"Choosing a Preset","\u002Fgetting-started\u002Fchoosing-a-preset","1.getting-started\u002F3.choosing-a-preset","i-lucide-git-branch",{"title":24,"path":25,"stem":26,"icon":27},"Deployment","\u002Fgetting-started\u002Fdeployment","1.getting-started\u002F4.deployment","i-lucide-cloud",{"title":29,"path":30,"stem":31,"icon":32},"Background Maintenance","\u002Fgetting-started\u002Fbackground-maintenance","1.getting-started\u002F5.background-maintenance","i-lucide-timer-reset",false,{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":33},"Build","i-lucide-wrench","\u002Fbuild","2.build",[40,45,50,55],{"title":41,"path":42,"stem":43,"icon":44},"Routers & Prefixes","\u002Fbuild\u002Frouters-and-prefixes","2.build\u002F1.routers-and-prefixes","i-lucide-route",{"title":46,"path":47,"stem":48,"icon":49},"Configuration","\u002Fbuild\u002Fconfiguration","2.build\u002F2.configuration","i-lucide-settings",{"title":51,"path":52,"stem":53,"icon":54},"Authorization Dependencies","\u002Fbuild\u002Fauthorization-dependencies","2.build\u002F3.authorization-dependencies","i-lucide-shield-check",{"title":56,"path":57,"stem":58,"icon":59},"Command Line","\u002Fbuild\u002Fcli","2.build\u002F4.cli","i-lucide-terminal",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":33},"Auth","i-lucide-lock","\u002Fauth","3.auth",[66,71,76,81,86,91,96,101,106,111],{"title":67,"path":68,"stem":69,"icon":70},"OAuth & Social Login","\u002Fauth\u002Foauth-and-social-login","3.auth\u002F1.oauth-and-social-login","i-lucide-log-in",{"title":72,"path":73,"stem":74,"icon":75},"Multi-Frontend Support","\u002Fauth\u002Fmulti-frontend","3.auth\u002F10.multi-frontend","i-lucide-layout-grid",{"title":77,"path":78,"stem":79,"icon":80},"Sessions & Audit","\u002Fauth\u002Fsessions-and-audit","3.auth\u002F2.sessions-and-audit","i-lucide-monitor-smartphone",{"title":82,"path":83,"stem":84,"icon":85},"Passwordless & Messaging","\u002Fauth\u002Fpasswordless-and-messaging","3.auth\u002F3.passwordless-and-messaging","i-lucide-mail",{"title":87,"path":88,"stem":89,"icon":90},"JWT Tokens","\u002Fauth\u002Fjwt-tokens","3.auth\u002F4.jwt-tokens","i-lucide-key-round",{"title":92,"path":93,"stem":94,"icon":95},"User Management API","\u002Fauth\u002Fuser-management-api","3.auth\u002F5.user-management-api","i-lucide-users",{"title":97,"path":98,"stem":99,"icon":100},"User Invitations","\u002Fauth\u002Fuser-invitations","3.auth\u002F6.user-invitations","i-lucide-send",{"title":102,"path":103,"stem":104,"icon":105},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F7.roles-and-permissions","i-lucide-shield",{"title":107,"path":108,"stem":109,"icon":110},"ABAC","\u002Fauth\u002Fabac","3.auth\u002F8.abac","i-lucide-filter",{"title":112,"path":113,"stem":114,"icon":115},"User Status","\u002Fauth\u002Fuser-status","3.auth\u002F9.user-status","i-lucide-user-cog",{"title":117,"icon":118,"path":119,"stem":120,"children":121,"page":33},"Enterprise","i-lucide-building-2","\u002Fenterprise","4.enterprise",[122,127,132],{"title":123,"path":124,"stem":125,"icon":126},"Core Authorization Concepts","\u002Fenterprise\u002Fcore-authorization-concepts","4.enterprise\u002F1.core-authorization-concepts","i-lucide-network",{"title":128,"path":129,"stem":130,"icon":131},"Entities","\u002Fenterprise\u002Fentities","4.enterprise\u002F2.entities","i-lucide-folder-tree",{"title":133,"path":134,"stem":135,"icon":136},"Entity Memberships","\u002Fenterprise\u002Fentity-memberships","4.enterprise\u002F3.entity-memberships","i-lucide-user-plus",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":33},"Integrations","i-lucide-plug","\u002Fintegrations","5.integrations",[143,148],{"title":144,"path":145,"stem":146,"icon":147},"API Keys","\u002Fintegrations\u002Fapi-keys","5.integrations\u002F1.api-keys","i-lucide-key",{"title":149,"path":150,"stem":151,"icon":152},"OutlabsAuth UI","\u002Fintegrations\u002Foutlabsauth-ui","5.integrations\u002F2.outlabsauth-ui","i-lucide-layout-dashboard",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":33},"Reference","i-lucide-book-marked","\u002Freference","6.reference",[159,164,169,174,179,184],{"title":160,"path":161,"stem":162,"icon":163},"Data Models","\u002Freference\u002Fdata-models","6.reference\u002F1.data-models","i-lucide-database",{"title":165,"path":166,"stem":167,"icon":168},"Activity Tracking","\u002Freference\u002Factivity-tracking","6.reference\u002F2.activity-tracking","i-lucide-activity",{"title":170,"path":171,"stem":172,"icon":173},"Testing","\u002Freference\u002Ftesting","6.reference\u002F3.testing","i-lucide-flask-conical",{"title":175,"path":176,"stem":177,"icon":178},"Observability","\u002Freference\u002Fobservability","6.reference\u002F4.observability","i-lucide-eye",{"title":180,"path":181,"stem":182,"icon":183},"Metrics Reference","\u002Freference\u002Fmetrics-reference","6.reference\u002F5.metrics-reference","i-lucide-chart-bar",{"title":185,"path":186,"stem":187,"icon":188},"Log Events Reference","\u002Freference\u002Flog-events-reference","6.reference\u002F6.log-events-reference","i-lucide-scroll-text",{"id":190,"title":175,"body":191,"description":771,"extension":772,"links":773,"meta":774,"navigation":775,"path":176,"seo":776,"stem":177,"__hash__":777},"docs\u002F6.reference\u002F4.observability.md",{"type":192,"value":193,"toc":763},"minimark",[194,210,223,273,276,281,284,300,390,400,424,434,473,479,481,485,561,568,570,574,580,596,613,619,621,624,638,651,662,664,668,723,725,729,759],[195,196,197],"note",{},[198,199,200,201,205,206,209],"p",{},"Metrics and logs without taking over your FastAPI app. Catalogs: ",[202,203,204],"a",{"href":181},"Metrics",", ",[202,207,208],{"href":186},"Log events",".",[198,211,212,213,217,218,222],{},"OutlabsAuth emits ",[214,215,216],"strong",{},"auth-domain"," logs and Prometheus metrics. Your host usually\nowns process logging, ",[219,220,221],"code",{},"\u002Fmetrics",", and tracing.",[224,225,226,242],"table",{},[227,228,229],"thead",{},[230,231,232,236,239],"tr",{},[233,234,235],"th",{},"Mode",[233,237,238],{},"When",[233,240,241],{},"What the library adds by default",[243,244,245,260],"tbody",{},[230,246,247,254,257],{},[248,249,250,253],"td",{},[214,251,252],{},"Embedded"," (recommended)",[248,255,256],{},"Real host APIs",[248,258,259],{},"Auth exception handler + UnitOfWork \u002F request-cache middleware",[230,261,262,267,270],{},[248,263,264],{},[214,265,266],{},"Standalone",[248,268,269],{},"Demos \u002F auth-first apps",[248,271,272],{},"Opt in to metrics route, correlation ID, resource context, broader exception handlers",[274,275],"hr",{},[277,278,280],"h2",{"id":279},"embedded-default","Embedded (default)",[198,282,283],{},"Rules of thumb:",[285,286,287,294,297],"ul",{},[288,289,290,291,293],"li",{},"Keep the host logger, Prometheus registry, ",[219,292,221],{},", and generic exception handlers",[288,295,296],{},"Pass the host registry into OutlabsAuth so auth metrics share one scrape",[288,298,299],{},"Let auth emit only auth-domain signals",[301,302,307],"pre",{"className":303,"code":304,"language":305,"meta":306,"style":306},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import logging\nfrom prometheus_client import REGISTRY\nfrom outlabs_auth import EnterpriseRBAC\nfrom outlabs_auth.observability import ObservabilityConfig\n\nauth = EnterpriseRBAC(\n    database_url=...,\n    secret_key=...,\n    observability_config=ObservabilityConfig(enable_metrics=True),\n    observability_logger=logging.getLogger(\"host_api.auth\"),\n    observability_metrics_registry=REGISTRY,\n)\nauth.instrument_fastapi(app)  # auth_only exceptions + UoW + request cache\n","python","",[219,308,309,317,323,329,335,342,348,354,360,366,372,378,384],{"__ignoreMap":306},[310,311,314],"span",{"class":312,"line":313},"line",1,[310,315,316],{},"import logging\n",[310,318,320],{"class":312,"line":319},2,[310,321,322],{},"from prometheus_client import REGISTRY\n",[310,324,326],{"class":312,"line":325},3,[310,327,328],{},"from outlabs_auth import EnterpriseRBAC\n",[310,330,332],{"class":312,"line":331},4,[310,333,334],{},"from outlabs_auth.observability import ObservabilityConfig\n",[310,336,338],{"class":312,"line":337},5,[310,339,341],{"emptyLinePlaceholder":340},true,"\n",[310,343,345],{"class":312,"line":344},6,[310,346,347],{},"auth = EnterpriseRBAC(\n",[310,349,351],{"class":312,"line":350},7,[310,352,353],{},"    database_url=...,\n",[310,355,357],{"class":312,"line":356},8,[310,358,359],{},"    secret_key=...,\n",[310,361,363],{"class":312,"line":362},9,[310,364,365],{},"    observability_config=ObservabilityConfig(enable_metrics=True),\n",[310,367,369],{"class":312,"line":368},10,[310,370,371],{},"    observability_logger=logging.getLogger(\"host_api.auth\"),\n",[310,373,375],{"class":312,"line":374},11,[310,376,377],{},"    observability_metrics_registry=REGISTRY,\n",[310,379,381],{"class":312,"line":380},12,[310,382,383],{},")\n",[310,385,387],{"class":312,"line":386},13,[310,388,389],{},"auth.instrument_fastapi(app)  # auth_only exceptions + UoW + request cache\n",[198,391,392,395,396,399],{},[219,393,394],{},"instrument_fastapi(app)"," ",[214,397,398],{},"always"," installs:",[285,401,402,412,418],{},[288,403,404,407,408,411],{},[219,405,406],{},"OutlabsAuthException"," handler (",[219,409,410],{},"exception_handler_mode=\"auth_only\"",")",[288,413,414,417],{},[219,415,416],{},"UnitOfWorkMiddleware"," (commit before response — read-your-writes)",[288,419,420,423],{},[219,421,422],{},"RequestCacheMiddleware"," (request-scoped permission memos)",[198,425,426,427,430,431,433],{},"It does ",[214,428,429],{},"not"," (unless you opt in): mount ",[219,432,221],{},", correlation-ID middleware,\nresource-context middleware, or global HTTP\u002Fvalidation\u002FException handlers.",[301,435,437],{"className":303,"code":436,"language":305,"meta":306,"style":306},"auth.instrument_fastapi(\n    app,\n    exception_handler_mode=\"auth_only\",\n    include_metrics=False,\n    include_correlation_id=False,\n    include_resource_context=False,\n)\n",[219,438,439,444,449,454,459,464,469],{"__ignoreMap":306},[310,440,441],{"class":312,"line":313},[310,442,443],{},"auth.instrument_fastapi(\n",[310,445,446],{"class":312,"line":319},[310,447,448],{},"    app,\n",[310,450,451],{"class":312,"line":325},[310,452,453],{},"    exception_handler_mode=\"auth_only\",\n",[310,455,456],{"class":312,"line":331},[310,457,458],{},"    include_metrics=False,\n",[310,460,461],{"class":312,"line":337},[310,462,463],{},"    include_correlation_id=False,\n",[310,465,466],{"class":312,"line":344},[310,467,468],{},"    include_resource_context=False,\n",[310,470,471],{"class":312,"line":350},[310,472,383],{},[198,474,475,476,209],{},"Shared SQLAlchemy engine: auth will not instrument that engine for DB metrics\nunless ",[219,477,478],{},"observability_instrument_external_engine=True",[274,480],{},[277,482,484],{"id":483},"standalone-demos","Standalone \u002F demos",[301,486,488],{"className":303,"code":487,"language":305,"meta":306,"style":306},"auth = SimpleRBAC(\n    database_url=...,\n    secret_key=...,\n    observability_config=ObservabilityConfig(\n        enable_metrics=True,\n        metrics_path=\"\u002Fmetrics\",\n    ),\n)\nauth.instrument_fastapi(\n    app,\n    exception_handler_mode=\"global\",\n    include_metrics=True,\n    include_correlation_id=True,\n    include_resource_context=True,\n)\n",[219,489,490,495,499,503,508,513,518,523,527,531,535,540,545,550,556],{"__ignoreMap":306},[310,491,492],{"class":312,"line":313},[310,493,494],{},"auth = SimpleRBAC(\n",[310,496,497],{"class":312,"line":319},[310,498,353],{},[310,500,501],{"class":312,"line":325},[310,502,359],{},[310,504,505],{"class":312,"line":331},[310,506,507],{},"    observability_config=ObservabilityConfig(\n",[310,509,510],{"class":312,"line":337},[310,511,512],{},"        enable_metrics=True,\n",[310,514,515],{"class":312,"line":344},[310,516,517],{},"        metrics_path=\"\u002Fmetrics\",\n",[310,519,520],{"class":312,"line":350},[310,521,522],{},"    ),\n",[310,524,525],{"class":312,"line":356},[310,526,383],{},[310,528,529],{"class":312,"line":362},[310,530,443],{},[310,532,533],{"class":312,"line":368},[310,534,448],{},[310,536,537],{"class":312,"line":374},[310,538,539],{},"    exception_handler_mode=\"global\",\n",[310,541,542],{"class":312,"line":380},[310,543,544],{},"    include_metrics=True,\n",[310,546,547],{"class":312,"line":386},[310,548,549],{},"    include_correlation_id=True,\n",[310,551,553],{"class":312,"line":552},14,[310,554,555],{},"    include_resource_context=True,\n",[310,557,559],{"class":312,"line":558},15,[310,560,383],{},[198,562,563,564,567],{},"Use ",[219,565,566],{},"exception_handler_mode=\"global\""," only when auth should own the full\nexception surface for that app.",[274,569],{},[277,571,573],{"id":572},"logging","Logging",[198,575,576,577,579],{},"Auth does ",[214,578,429],{}," reconfigure global logging.",[285,581,582,589],{},[288,583,584,585,588],{},"Pass ",[219,586,587],{},"observability_logger=..."," to emit through your logger, or",[288,590,591,592,595],{},"Fall back to ",[219,593,594],{},"ObservabilityConfig.logger_name"," (namespaced)",[198,597,598,599,602,603,602,606,609,610,209],{},"Presets: ",[219,600,601],{},"ObservabilityPresets.development()"," \u002F ",[219,604,605],{},".staging()",[219,607,608],{},".production()"," \u002F\n",[219,611,612],{},".disabled()",[198,614,615,616,209],{},"Event catalog: ",[202,617,618],{"href":186},"99 — Log Events",[274,620],{},[277,622,204],{"id":623},"metrics",[198,625,626,627,630,631,205,634,637],{},"With ",[219,628,629],{},"enable_metrics=True",", auth registers namespaced series such as\n",[219,632,633],{},"outlabs_auth_login_attempts_total",[219,635,636],{},"outlabs_auth_permission_checks_total",",\nentity ops, and DB query duration histograms.",[198,639,640,641,644,645,647,648,209],{},"Inject ",[219,642,643],{},"observability_metrics_registry=REGISTRY"," in embedded hosts so one\n",[219,646,221],{}," scrape includes host + auth. Full list:\n",[202,649,650],{"href":181},"98 — Metrics",[198,652,653,654,209],{},"Portable Grafana\u002FPrometheus stack: ",[202,655,659],{"href":656,"rel":657},"https:\u002F\u002Fgithub.com\u002Foutlabsio\u002FoutlabsAuth\u002Ftree\u002Fmain\u002Fobservability",[658],"nofollow",[219,660,661],{},"observability\u002F",[274,663],{},[277,665,667],{"id":666},"troubleshooting","Troubleshooting",[224,669,670,680],{},[227,671,672],{},[230,673,674,677],{},[233,675,676],{},"Symptom",[233,678,679],{},"Check",[243,681,682,697,709],{},[230,683,684,689],{},[248,685,686,687],{},"No auth metrics on host ",[219,688,221],{},[248,690,691,693,694],{},[219,692,629],{},"; same registry for scrape and ",[219,695,696],{},"observability_metrics_registry",[230,698,699,702],{},[248,700,701],{},"Middleware missing",[248,703,704,705,708],{},"Call ",[219,706,707],{},"instrument_fastapi"," at import time (before the app starts serving)",[230,710,711,714],{},[248,712,713],{},"Host handlers overwritten",[248,715,716,717,719,720],{},"Stay on ",[219,718,410],{}," or ",[219,721,722],{},"register_outlabs_exception_handler(app)",[274,724],{},[277,726,728],{"id":727},"related","Related",[285,730,731,735,739,743,752],{},[288,732,733],{},[202,734,180],{"href":181},[288,736,737],{},[202,738,185],{"href":186},[288,740,741],{},[202,742,46],{"href":47},[288,744,745,747,748,751],{},[202,746,107],{"href":108}," — ",[219,749,750],{},"include_resource_context"," when using request-state merge",[288,753,754],{},[202,755,757],{"href":656,"rel":756},[658],[219,758,661],{},[760,761,762],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":306,"searchDepth":313,"depth":319,"links":764},[765,766,767,768,769,770],{"id":279,"depth":319,"text":280},{"id":483,"depth":319,"text":484},{"id":572,"depth":319,"text":573},{"id":623,"depth":319,"text":204},{"id":666,"depth":319,"text":667},{"id":727,"depth":319,"text":728},"Metrics and logs without taking over your FastAPI app.","md",null,{},{"icon":178},{"title":175,"description":771},"XVBnVi8pwwtpFVkk9bOWXrAlBD6be_MXPhX9rMFQMBw",[779,781],{"title":170,"path":171,"stem":172,"description":780,"icon":173,"children":-1},"Run and extend library and host tests.",{"title":180,"path":181,"stem":182,"description":782,"icon":183,"children":-1},"Prometheus metric catalog.",1787472744721]