[{"data":1,"prerenderedAt":565},["ShallowReactive",2],{"navigation_docs":3,"-integrations-analytics-grafana":339,"-integrations-analytics-grafana-surround":560},[4,10,71,97,249,320],{"title":5,"path":6,"stem":7,"icon":8,"exact":9},"Introduction","\u002F","0.index","i-lucide-book-open",true,{"title":11,"icon":12,"modifiedAt":13,"path":14,"stem":15,"children":16,"page":12},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[17,22,27,32,37,42,47,61,66],{"title":18,"path":19,"stem":20,"icon":21},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":23,"path":24,"stem":25,"icon":26},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":28,"path":29,"stem":30,"icon":31},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":33,"path":34,"stem":35,"icon":36},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":38,"path":39,"stem":40,"icon":41},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":43,"path":44,"stem":45,"icon":46},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":48,"modifiedAt":49,"icon":50,"defaultOpen":12,"path":51,"stem":52,"children":53},"Experiments","2026-11-10T01:16:18.000Z","i-lucide-flask-round","\u002Fgetting-started\u002Fexperiments","1.getting-started\u002F7.experiments\u002Findex",[54,56],{"title":55,"path":51,"stem":52,"icon":8},"Overview",{"title":57,"path":58,"stem":59,"icon":60},"How results are computed","\u002Fgetting-started\u002Fexperiments\u002Fhow-results-are-computed","1.getting-started\u002F7.experiments\u002F1.how-results-are-computed","i-lucide-sigma",{"title":62,"path":63,"stem":64,"icon":65},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F8.segments","i-lucide-squares-intersect",{"title":67,"path":68,"stem":69,"icon":70},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F9.pricing-and-billing","i-lucide-credit-card",{"title":72,"modifiedAt":73,"defaultOpen":9,"path":74,"stem":75,"children":76,"page":12},"Monitoring","2026-09-24T23:33:20.000Z","\u002Fmonitoring","2.monitoring",[77,82,87,92],{"title":78,"path":79,"stem":80,"icon":81},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":83,"path":84,"stem":85,"icon":86},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":88,"path":89,"stem":90,"icon":91},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":93,"path":94,"stem":95,"icon":96},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":98,"modifiedAt":73,"defaultOpen":9,"path":99,"stem":100,"children":101,"page":12},"SDKs","\u002Fsdks","3.sdks",[102,107,128,153,169,200,244],{"title":103,"path":104,"stem":105,"icon":106},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":108,"modifiedAt":73,"icon":109,"defaultOpen":12,"path":110,"stem":111,"children":112,"page":12},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[113,118,123],{"title":114,"path":115,"stem":116,"icon":117},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":119,"path":120,"stem":121,"icon":122},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":124,"path":125,"stem":126,"icon":127},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":129,"modifiedAt":73,"icon":130,"defaultOpen":12,"path":131,"stem":132,"children":133,"page":12},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":122},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":139,"path":140,"stem":141,"icon":142},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":144,"path":145,"stem":146,"icon":147},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":149,"path":150,"stem":151,"icon":152},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":154,"modifiedAt":73,"icon":155,"defaultOpen":12,"path":156,"stem":157,"children":158,"page":12},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[159,164],{"title":160,"path":161,"stem":162,"icon":163},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":165,"path":166,"stem":167,"icon":168},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":170,"modifiedAt":73,"icon":171,"defaultOpen":12,"path":172,"stem":173,"children":174,"page":12},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[175,180,185,190,195],{"title":176,"path":177,"stem":178,"icon":179},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":181,"path":182,"stem":183,"icon":184},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":186,"path":187,"stem":188,"icon":189},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":191,"path":192,"stem":193,"icon":194},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":196,"path":197,"stem":198,"icon":199},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":201,"modifiedAt":73,"icon":202,"defaultOpen":12,"path":203,"stem":204,"children":205},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature\u002Findex",[206,207,212,216,220,224,228,232,236,240],{"title":55,"path":203,"stem":204,"icon":202},{"title":208,"path":209,"stem":210,"icon":202,"icons":211},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[202,117],{"title":144,"path":213,"stem":214,"icon":202,"icons":215},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[202,147],{"title":149,"path":217,"stem":218,"icon":202,"icons":219},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[202,152],{"title":139,"path":221,"stem":222,"icon":202,"icons":223},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[202,142],{"title":176,"path":225,"stem":226,"icon":202,"icons":227},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[202,179],{"title":181,"path":229,"stem":230,"icon":202,"icons":231},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[202,184],{"title":186,"path":233,"stem":234,"icon":202,"icons":235},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[202,189],{"title":191,"path":237,"stem":238,"icon":202,"icons":239},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[202,194],{"title":196,"path":241,"stem":242,"icon":202,"icons":243},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[202,199],{"title":245,"path":246,"stem":247,"icon":248},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":250,"modifiedAt":73,"defaultOpen":9,"path":251,"stem":252,"children":253,"page":12},"Integrations","\u002Fintegrations","4.integrations",[254,259,264,269,274,278,283],{"title":255,"path":256,"stem":257,"icon":258},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F1.mcp","cd-logos-mcp",{"title":260,"path":261,"stem":262,"icon":263},"Agent Skills","\u002Fintegrations\u002Fagents","4.integrations\u002F2.agents","i-lucide-bot",{"title":265,"path":266,"stem":267,"icon":268},"CLI","\u002Fintegrations\u002Fcli","4.integrations\u002F3.cli","cd-logos-cli",{"title":270,"path":271,"stem":272,"icon":273},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F4.terraform","cd-logos-terraform",{"title":275,"path":276,"stem":277,"icon":41},"Admin API","\u002Fintegrations\u002Fadmin-api","4.integrations\u002F5.admin-api",{"title":279,"path":280,"stem":281,"icon":282},"Webhooks","\u002Fintegrations\u002Fwebhooks","4.integrations\u002F6.webhooks","i-lucide-webhook",{"title":284,"modifiedAt":285,"icon":286,"defaultOpen":12,"path":287,"stem":288,"children":289},"Analytics","2026-11-08T17:10:01.000Z","i-lucide-chart-line","\u002Fintegrations\u002Fanalytics","4.integrations\u002F7.analytics\u002Findex",[290,292,296,300,304,308,312,316],{"title":55,"path":287,"stem":288,"icon":291},"i-lucide-blocks",{"title":293,"path":294,"stem":295,"icon":286},"Amplitude","\u002Fintegrations\u002Fanalytics\u002Famplitude","4.integrations\u002F7.analytics\u002F1.amplitude",{"title":297,"path":298,"stem":299,"icon":286},"Datadog","\u002Fintegrations\u002Fanalytics\u002Fdatadog","4.integrations\u002F7.analytics\u002F2.datadog",{"title":301,"path":302,"stem":303,"icon":286},"Google Analytics 4","\u002Fintegrations\u002Fanalytics\u002Fga4","4.integrations\u002F7.analytics\u002F3.ga4",{"title":305,"path":306,"stem":307,"icon":286},"Grafana","\u002Fintegrations\u002Fanalytics\u002Fgrafana","4.integrations\u002F7.analytics\u002F4.grafana",{"title":309,"path":310,"stem":311,"icon":286},"Mixpanel","\u002Fintegrations\u002Fanalytics\u002Fmixpanel","4.integrations\u002F7.analytics\u002F5.mixpanel",{"title":313,"path":314,"stem":315,"icon":286},"PostHog","\u002Fintegrations\u002Fanalytics\u002Fposthog","4.integrations\u002F7.analytics\u002F6.posthog",{"title":317,"path":318,"stem":319,"icon":286},"Segment","\u002Fintegrations\u002Fanalytics\u002Fsegment","4.integrations\u002F7.analytics\u002F7.segment",{"title":321,"modifiedAt":322,"defaultOpen":9,"path":323,"stem":324,"children":325,"page":12},"Migration Guides","2026-10-16T17:57:49.000Z","\u002Fmigration-guides","5.migration-guides",[326,331,335],{"title":327,"path":328,"stem":329,"icon":330},"From LaunchDarkly","\u002Fmigration-guides\u002Flaunchdarkly","5.migration-guides\u002F1.launchdarkly","i-lucide-baggage-claim",{"title":332,"path":333,"stem":334,"icon":330},"From Firebase Remote Config","\u002Fmigration-guides\u002Ffirebase-remote-config","5.migration-guides\u002F2.firebase-remote-config",{"title":336,"path":337,"stem":338,"icon":330},"From Firebase A\u002FB Testing","\u002Fmigration-guides\u002Ffirebase-ab-testing","5.migration-guides\u002F3.firebase-ab-testing",{"id":340,"title":305,"body":341,"description":551,"extension":552,"links":553,"meta":554,"navigation":555,"path":306,"seo":556,"stem":307,"__hash__":559},"docs\u002F4.integrations\u002F7.analytics\u002F4.grafana.md",{"type":342,"value":343,"toc":543},"minimark",[344,348,357,365,369,429,433,493,500,504,520],[345,346,5],"h2",{"id":347},"introduction",[349,350,351,352,356],"p",{},"A Grafana integration marks every ",[353,354,355],"a",{"href":51},"experiment"," run in Grafana: a marker when a run starts, when its split changes, when a variation is shipped and when the run is stopped. The markers land next to the metrics the run is meant to move. You set this up in the dashboard, with no code.",[349,358,359,360,364],{},"The marker is an organization-wide annotation, shown on dashboards whose annotation settings include it, tagged ",[361,362,363],"code",{},"configdirector",", the config key and the environment slug.",[345,366,368],{"id":367},"settings","Settings",[370,371,372,385],"table",{},[373,374,375],"thead",{},[376,377,378,382],"tr",{},[379,380,381],"th",{},"Setting",[379,383,384],{},"Value",[386,387,388,407],"tbody",{},[376,389,390,397],{},[391,392,393],"td",{},[394,395,396],"strong",{},"Grafana URL",[391,398,399,400,403,404],{},"The ",[361,401,402],{},"https:\u002F\u002F"," address of your Grafana, without a path. Grafana Cloud stacks look like ",[361,405,406],{},"https:\u002F\u002Facme.grafana.net",[376,408,409,414],{},[391,410,411],{},[394,412,413],{},"Service account token",[391,415,416,417,420,421,424,425,428],{},"A token of a service account with the ",[361,418,419],{},"annotations:create"," permission, created under ",[394,422,423],{},"Administration"," > ",[394,426,427],{},"Service accounts"," in Grafana",[345,430,432],{"id":431},"create-the-integration","Create the integration",[434,435,436,447,450,453,468,475,478],"ol",{},[437,438,439,440,442,443,446],"li",{},"Open ",[394,441,250],{}," at the bottom of the dashboard's navigation and pick the tool, or click ",[394,444,445],{},"Add integration"," when you already have one.",[437,448,449],{},"Give the integration a name, or keep the tool's name.",[437,451,452],{},"Fill in the settings above and paste the credential you created in the tool. Credentials are stored encrypted and never shown again.",[437,454,455,456,459,460,463,464,467],{},"Narrow it down with the ",[394,457,458],{},"Projects",", ",[394,461,462],{},"Environments"," and ",[394,465,466],{},"Tags"," filters, or leave them empty to mark every run. A run is marked when its project, its environment and its config's tags pass every filter you set; an empty filter lets everything through. An integration filtered to Production marks Production runs only.",[437,469,470,471,474],{},"Keep ",[394,472,473],{},"Enabled"," on. A disabled integration marks nothing, and runs that start or end while it is disabled are not marked later.",[437,476,477],{},"Save. The integration's page shows the tool's settings and the address it posts to.",[437,479,480,481,484,485,488,489,492],{},"Click ",[394,482,483],{},"Send test marker"," and confirm. A marker titled ",[394,486,487],{},"ConfigDirector test"," is posted to the tool right away, at the current time, and shows under ",[394,490,491],{},"Deliveries"," with the tool's response, so you can see where run markers will land.",[349,494,399,495,499],{},[353,496,498],{"href":497},"\u002Fintegrations\u002Fanalytics#mark-experiment-runs-on-your-charts","Analytics overview"," explains what each marker says, how deliveries are retried and what happens when the tool stops accepting markers.",[345,501,503],{"id":502},"what-configdirector-posts","What ConfigDirector posts",[349,505,506,507,510,511,515,516,519],{},"The integration posts to ",[361,508,509],{},"{Grafana URL}\u002Fapi\u002Fannotations"," with the token as a Bearer token. Set an ",[353,512,514],{"href":513},"\u002Fintegrations\u002Fanalytics#endpoint-url-override","endpoint URL"," under ",[394,517,518],{},"Advanced"," only to post somewhere else.",[349,521,522,523,526,527,530,531,534,535,542],{},"The body sent is ",[361,524,525],{},"{ \"text\", \"time\", \"tags\" }",", with ",[361,528,529],{},"time"," in epoch milliseconds; no ",[361,532,533],{},"dashboardUID"," is sent. Grafana's documentation: ",[353,536,541],{"href":537,"rel":538,"target":540},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana\u002Flatest\u002Fdevelopers\u002Fhttp_api\u002Fannotations\u002F",[539],"noopener","_blank","Annotations API",".",{"title":544,"searchDepth":545,"depth":545,"links":546},"",2,[547,548,549,550],{"id":347,"depth":545,"text":5},{"id":367,"depth":545,"text":368},{"id":431,"depth":545,"text":432},{"id":502,"depth":545,"text":503},"Mark every experiment run on your Grafana dashboards with a ConfigDirector integration. The settings it needs, how to create it, and where the markers appear.","md",null,{"modifiedAt":285},{"title":305,"icon":286},{"title":557,"description":558},"Mark Experiment Runs in Grafana","Connect ConfigDirector to Grafana so that every experiment run start, split change, ship and stop shows as an annotation on your dashboards, next to the metrics the run is meant to move.","1rKwr-rvtAxwKSvC3UMuWp6JGFgQIJufmipeK85nFoI",[561,563],{"title":301,"path":302,"stem":303,"description":562,"icon":286,"children":-1},"Report experiment exposures to Google Analytics 4 from your application, so you can compare the variations next to the events you already track there.",{"title":309,"path":310,"stem":311,"description":564,"icon":286,"children":-1},"Mark every experiment run on your Mixpanel charts, and report experiment exposures to Mixpanel from your application so you can compare the variations next to the events you already track there.",1794464795052]