[{"data":1,"prerenderedAt":638},["ShallowReactive",2],{"navigation_docs":3,"-operate-observability":136,"-operate-observability-surround":633},[4,26,47,68,89,110,123],{"title":5,"path":6,"stem":7,"children":8,"page":25},"Getting Started","\u002Fgetting-started","1.getting-started",[9,13,17,21],{"title":10,"path":11,"stem":12},"What you are running","\u002Fgetting-started\u002Fwhat-you-are-running","1.getting-started\u002F1.what-you-are-running",{"title":14,"path":15,"stem":16},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F2.architecture",{"title":18,"path":19,"stem":20},"Prerequisites","\u002Fgetting-started\u002Fprerequisites","1.getting-started\u002F3.prerequisites",{"title":22,"path":23,"stem":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F4.quickstart",false,{"title":27,"path":28,"stem":29,"children":30,"page":25},"Install","\u002Finstall","2.install",[31,35,39,43],{"title":32,"path":33,"stem":34},"Install the chart","\u002Finstall\u002Finstall-the-chart","2.install\u002F1.install-the-chart",{"title":36,"path":37,"stem":38},"Activation","\u002Finstall\u002Factivation","2.install\u002F2.activation",{"title":40,"path":41,"stem":42},"DNS and TLS","\u002Finstall\u002Fdns-and-tls","2.install\u002F3.dns-and-tls",{"title":44,"path":45,"stem":46},"Verify your install","\u002Finstall\u002Fverify-your-install","2.install\u002F4.verify-your-install",{"title":48,"path":49,"stem":50,"children":51,"page":25},"Configure","\u002Fconfigure","3.configure",[52,56,60,64],{"title":53,"path":54,"stem":55},"Data services","\u002Fconfigure\u002Fdata-services","3.configure\u002F1.data-services",{"title":57,"path":58,"stem":59},"Secrets","\u002Fconfigure\u002Fsecrets","3.configure\u002F2.secrets",{"title":61,"path":62,"stem":63},"Registry and air-gapped installs","\u002Fconfigure\u002Fregistry-and-airgap","3.configure\u002F3.registry-and-airgap",{"title":65,"path":66,"stem":67},"Integrations","\u002Fconfigure\u002Fintegrations","3.configure\u002F4.integrations",{"title":69,"path":70,"stem":71,"children":72,"page":25},"Licensing","\u002Flicensing","4.licensing",[73,77,81,85],{"title":74,"path":75,"stem":76},"How licensing works","\u002Flicensing\u002Fhow-licensing-works","4.licensing\u002F1.how-licensing-works",{"title":78,"path":79,"stem":80},"Your key never leaves","\u002Flicensing\u002Fyour-key-never-leaves","4.licensing\u002F2.your-key-never-leaves",{"title":82,"path":83,"stem":84},"What phones home","\u002Flicensing\u002Fwhat-phones-home","4.licensing\u002F3.what-phones-home",{"title":86,"path":87,"stem":88},"Revoke and recover","\u002Flicensing\u002Frevoke-and-recover","4.licensing\u002F4.revoke-and-recover",{"title":90,"path":91,"stem":92,"children":93,"page":25},"Operate","\u002Foperate","5.operate",[94,98,102,106],{"title":95,"path":96,"stem":97},"Upgrade","\u002Foperate\u002Fupgrade","5.operate\u002F1.upgrade",{"title":99,"path":100,"stem":101},"Backup and restore","\u002Foperate\u002Fbackup-and-restore","5.operate\u002F2.backup-and-restore",{"title":103,"path":104,"stem":105},"Observability","\u002Foperate\u002Fobservability","5.operate\u002F3.observability",{"title":107,"path":108,"stem":109},"High availability","\u002Foperate\u002Fhigh-availability","5.operate\u002F4.high-availability",{"title":111,"path":112,"stem":113,"children":114,"page":25},"Troubleshooting","\u002Ftroubleshooting","6.troubleshooting",[115,119],{"title":116,"path":117,"stem":118},"Install failures","\u002Ftroubleshooting\u002Finstall-failures","6.troubleshooting\u002F1.install-failures",{"title":120,"path":121,"stem":122},"Licensing failures","\u002Ftroubleshooting\u002Flicensing-failures","6.troubleshooting\u002F2.licensing-failures",{"title":124,"path":125,"stem":126,"children":127,"page":25},"Reference","\u002Freference","9.reference",[128,132],{"title":129,"path":130,"stem":131},"Helm values","\u002Freference\u002Fhelm-values","9.reference\u002F1.helm-values",{"title":133,"path":134,"stem":135},"Environment variables","\u002Freference\u002Fenvironment","9.reference\u002F2.environment",{"id":137,"title":103,"body":138,"description":626,"extension":627,"links":628,"meta":629,"navigation":630,"path":104,"seo":631,"stem":105,"__hash__":632},"docs\u002F5.operate\u002F3.observability.md",{"type":139,"value":140,"toc":620},"minimark",[141,145,158,163,166,212,215,307,319,323,330,483,493,500,521,525,533,544,547,568,576,582,586,593,608,616],[142,143,103],"h1",{"id":144},"observability",[146,147,148,149,153,154,157],"p",{},"The license agent serves Prometheus text-format metrics on port ",[150,151,152],"code",{},"9090"," at ",[150,155,156],{},"\u002Fmetrics",". This is the surface that tells you whether your platform is going to keep serving tomorrow.",[159,160,162],"h2",{"id":161},"reading-the-metrics","Reading the metrics",[146,164,165],{},"The chart renders no Service for the agent, so scrape the pod directly with Prometheus pod discovery, or look at it by hand:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kubectl -n my-mvno port-forward deploy\u002Fmy-mvno-platform-license-agent 9090:9090\ncurl -s localhost:9090\u002Fmetrics\n","bash","",[150,174,175,200],{"__ignoreMap":172},[176,177,180,184,188,191,194,197],"span",{"class":178,"line":179},"line",1,[176,181,183],{"class":182},"sBMFI","kubectl",[176,185,187],{"class":186},"sfazB"," -n",[176,189,190],{"class":186}," my-mvno",[176,192,193],{"class":186}," port-forward",[176,195,196],{"class":186}," deploy\u002Fmy-mvno-platform-license-agent",[176,198,199],{"class":186}," 9090:9090\n",[176,201,203,206,209],{"class":178,"line":202},2,[176,204,205],{"class":182},"curl",[176,207,208],{"class":186}," -s",[176,210,211],{"class":186}," localhost:9090\u002Fmetrics\n",[146,213,214],{},"Five values come back:",[216,217,218,234],"table",{},[219,220,221],"thead",{},[222,223,224,228,231],"tr",{},[225,226,227],"th",{},"Metric",[225,229,230],{},"Type",[225,232,233],{},"Meaning",[235,236,237,251,264,276,288],"tbody",{},[222,238,239,245,248],{},[240,241,242],"td",{},[150,243,244],{},"license_expiry_seconds",[240,246,247],{},"gauge",[240,249,250],{},"Seconds until the currently held lease expires",[222,252,253,258,261],{},[240,254,255],{},[150,256,257],{},"license_renew_failures_total",[240,259,260],{},"counter",[240,262,263],{},"Renew attempts that did not succeed",[222,265,266,271,273],{},[240,267,268],{},[150,269,270],{},"license_rotations_total",[240,272,260],{},[240,274,275],{},"Successful renew-and-rotate cycles",[222,277,278,283,285],{},[240,279,280],{},[150,281,282],{},"license_renew_last_success_timestamp_seconds",[240,284,247],{},[240,286,287],{},"Unix time of the last successful renew",[222,289,290,295,297],{},[240,291,292],{},[150,293,294],{},"license_revoked",[240,296,247],{},[240,298,299,302,303,306],{},[150,300,301],{},"1"," when the parent has revoked this deployment's lease, ",[150,304,305],{},"0"," otherwise",[146,308,309,311,312,314,315,318],{},[150,310,244],{}," drains steadily and then jumps back up each time the agent renews. That sawtooth is what healthy looks like. ",[150,313,270],{}," should tick up at the same moments. If you would rather look at freshness than at remaining life, ",[150,316,317],{},"time() - license_renew_last_success_timestamp_seconds"," gives you the age of the last good renewal.",[159,320,322],{"id":321},"the-alert-to-run","The alert to run",[146,324,325,326,329],{},"One rule matters more than the rest: the platform is heading toward an expired lease, and an expired lease means it stops serving business routes. Fail-closed is deliberate (see ",[327,328,74],"a",{"href":75},"), which makes this a page, not a ticket.",[167,331,335],{"className":332,"code":333,"language":334,"meta":172,"style":172},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","groups:\n  - name: solvegio-license\n    rules:\n      - alert: SolvegioLicenseAtRisk\n        expr: |\n          license_expiry_seconds{job=\"solvegio-license-agent\"} \u003C 86400\n          or\n          absent(license_expiry_seconds{job=\"solvegio-license-agent\"})\n        for: 15m\n        labels:\n          severity: page\n        annotations:\n          summary: \"Solvegio lease expiring, or the license agent has stopped reporting\"\n          description: \"Check: kubectl -n my-mvno logs deploy\u002Fmy-mvno-platform-license-agent\"\n","yaml",[150,336,337,347,361,369,383,395,401,407,413,424,432,443,451,468],{"__ignoreMap":172},[176,338,339,343],{"class":178,"line":179},[176,340,342],{"class":341},"swJcz","groups",[176,344,346],{"class":345},"sMK4o",":\n",[176,348,349,352,355,358],{"class":178,"line":202},[176,350,351],{"class":345},"  -",[176,353,354],{"class":341}," name",[176,356,357],{"class":345},":",[176,359,360],{"class":186}," solvegio-license\n",[176,362,364,367],{"class":178,"line":363},3,[176,365,366],{"class":341},"    rules",[176,368,346],{"class":345},[176,370,372,375,378,380],{"class":178,"line":371},4,[176,373,374],{"class":345},"      -",[176,376,377],{"class":341}," alert",[176,379,357],{"class":345},[176,381,382],{"class":186}," SolvegioLicenseAtRisk\n",[176,384,386,389,391],{"class":178,"line":385},5,[176,387,388],{"class":341},"        expr",[176,390,357],{"class":345},[176,392,394],{"class":393},"s7zQu"," |\n",[176,396,398],{"class":178,"line":397},6,[176,399,400],{"class":186},"          license_expiry_seconds{job=\"solvegio-license-agent\"} \u003C 86400\n",[176,402,404],{"class":178,"line":403},7,[176,405,406],{"class":186},"          or\n",[176,408,410],{"class":178,"line":409},8,[176,411,412],{"class":186},"          absent(license_expiry_seconds{job=\"solvegio-license-agent\"})\n",[176,414,416,419,421],{"class":178,"line":415},9,[176,417,418],{"class":341},"        for",[176,420,357],{"class":345},[176,422,423],{"class":186}," 15m\n",[176,425,427,430],{"class":178,"line":426},10,[176,428,429],{"class":341},"        labels",[176,431,346],{"class":345},[176,433,435,438,440],{"class":178,"line":434},11,[176,436,437],{"class":341},"          severity",[176,439,357],{"class":345},[176,441,442],{"class":186}," page\n",[176,444,446,449],{"class":178,"line":445},12,[176,447,448],{"class":341},"        annotations",[176,450,346],{"class":345},[176,452,454,457,459,462,465],{"class":178,"line":453},13,[176,455,456],{"class":341},"          summary",[176,458,357],{"class":345},[176,460,461],{"class":345}," \"",[176,463,464],{"class":186},"Solvegio lease expiring, or the license agent has stopped reporting",[176,466,467],{"class":345},"\"\n",[176,469,471,474,476,478,481],{"class":178,"line":470},14,[176,472,473],{"class":341},"          description",[176,475,357],{"class":345},[176,477,461],{"class":345},[176,479,480],{"class":186},"Check: kubectl -n my-mvno logs deploy\u002Fmy-mvno-platform-license-agent",[176,482,467],{"class":345},[146,484,485,486,488,489,492],{},"Both halves are load bearing. A dead agent stops publishing ",[150,487,244],{}," entirely, and a rule that only compares that gauge against a number has no series left to evaluate, so it quietly evaluates to nothing instead of firing. ",[150,490,491],{},"absent()"," catches exactly that case: the series went missing, which is the failure you least want to sleep through.",[146,494,495,496,499],{},"Adjust ",[150,497,498],{},"86400"," (one day of remaining lease) to whatever notice period you actually want. Give yourself enough room to reach us during working hours.",[146,501,502,503,505,506,508,509,505,511,513,514,517,518,520],{},"When the parent revokes a deployment, the agent sets ",[150,504,294],{}," to ",[150,507,301],{}," and drains ",[150,510,244],{},[150,512,305],{},", so this same rule fires rather than sitting on a frozen gauge. You can alert on ",[150,515,516],{},"license_revoked == 1"," separately if you want revocation to page with its own message. ",[327,519,86],{"href":87}," covers what to do about it.",[159,522,524],{"id":523},"the-softer-signal","The softer signal",[146,526,527,529,530,532],{},[150,528,257],{}," climbing while ",[150,531,244],{}," is still comfortably high means renewals are failing but you have grace left. That is a warning, not an outage. The agent retries with an increasing backoff and will usually recover on its own if the cause is a transient network problem. If it is not transient, you want to know before the grace runs out:",[167,534,538],{"className":535,"code":536,"language":537,"meta":172,"style":172},"language-promql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","increase(license_renew_failures_total[1h]) > 3\n","promql",[150,539,540],{"__ignoreMap":172},[176,541,542],{"class":178,"line":179},[176,543,536],{},[146,545,546],{},"Pair it with the agent's own log, which escalates in step with the remaining lease:",[167,548,550],{"className":169,"code":549,"language":171,"meta":172,"style":172},"kubectl -n my-mvno logs deploy\u002Fmy-mvno-platform-license-agent --since=1h\n",[150,551,552],{"__ignoreMap":172},[176,553,554,556,558,560,563,565],{"class":178,"line":179},[176,555,183],{"class":182},[176,557,187],{"class":186},[176,559,190],{"class":186},[176,561,562],{"class":186}," logs",[176,564,196],{"class":186},[176,566,567],{"class":186}," --since=1h\n",[167,569,574],{"className":570,"code":572,"language":573},[571],"language-text","level=WARN  msg=\"agent: renew failing, less than half the lease TTL remains\" remaining=...\nlevel=ERROR msg=\"agent: renew failing, lease nearing expiry\" remaining=...\n","text",[150,575,572],{"__ignoreMap":172},[146,577,578,579,581],{},"The ERROR line means the platform is on course to stop serving. Take it to ",[327,580,120],{"href":121},".",[159,583,585],{"id":584},"the-rest-of-the-platform","The rest of the platform",[146,587,588,589,592],{},"The API exposes ",[150,590,591],{},"\u002Fhealth"," on its own Ingress host, which is what your uptime checker should hit:",[167,594,596],{"className":169,"code":595,"language":171,"meta":172,"style":172},"curl -sf https:\u002F\u002Fapi.acme.com\u002Fhealth\n",[150,597,598],{"__ignoreMap":172},[176,599,600,602,605],{"class":178,"line":179},[176,601,205],{"class":182},[176,603,604],{"class":186}," -sf",[176,606,607],{"class":186}," https:\u002F\u002Fapi.acme.com\u002Fhealth\n",[146,609,610,612,613,615],{},[150,611,591],{}," stays up even when the platform has parked itself over a revoked or expired lease. That is on purpose: the process is quiesced, not broken, and you want to be able to reach it. So a green ",[150,614,591],{}," is not by itself proof that the platform is serving customers. The license metrics above are what tell you that.",[617,618,619],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":172,"searchDepth":179,"depth":202,"links":621},[622,623,624,625],{"id":161,"depth":202,"text":162},{"id":321,"depth":202,"text":322},{"id":523,"depth":202,"text":524},{"id":584,"depth":202,"text":585},"The license agent's Prometheus metrics, and the one alert that tells you a licensed platform is about to stop serving.","md",null,{},true,{"title":103,"description":626},"DCs4lD1boDcR049nG2KnvMYQHRslO3LfCVo2LIJnWP0",[634,636],{"title":99,"path":100,"stem":101,"description":635,"children":-1},"Back up the database and the platform Secret, and know what to do if either one is gone.",{"title":107,"path":108,"stem":109,"description":637,"children":-1},"Operator-mode data services, multiple API replicas, and the one component that must stay at a single replica.",1783967741116]