[{"data":1,"prerenderedAt":1342},["ShallowReactive",2],{"navigation":3,"/pdfrest-api-toolkit-container/monitoring/":132,"/pdfrest-api-toolkit-container/monitoring/-surround":1337},[4,14,37,74,97,106,123],{"title":5,"path":6,"stem":7,"children":8,"icon":11,"fields":12},"Overview","/overview","0.overview/index",[9],{"title":10,"path":6,"stem":7},"pdfRest API Documentation","pdfrest:pdf-toolkit-self-hosted",{"hidden":13},true,{"title":15,"icon":16,"path":17,"stem":18,"children":19,"page":36},"Cloud","vscode-icons:file-type-pdf2","/pdfrest-api-toolkit-cloud","1.pdfrest-api-toolkit-cloud",[20,24,28,32],{"title":21,"path":22,"stem":23},"Getting Started","/pdfrest-api-toolkit-cloud/getting-started","1.pdfrest-api-toolkit-cloud/1.getting-started",{"title":25,"path":26,"stem":27},"Frequently Asked Questions","/pdfrest-api-toolkit-cloud/frequently-asked-questions","1.pdfrest-api-toolkit-cloud/2.frequently-asked-questions",{"title":29,"path":30,"stem":31},"API Polling","/pdfrest-api-toolkit-cloud/api-polling","1.pdfrest-api-toolkit-cloud/3.api-polling",{"title":33,"path":34,"stem":35},"Custom Compression Profiles","/pdfrest-api-toolkit-cloud/custom-compression-profiles","1.pdfrest-api-toolkit-cloud/4.custom-compression-profiles",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Container","vscode-icons:file-type-docker2","/pdfrest-api-toolkit-container","2.pdfrest-api-toolkit-container",[43,46,50,54,58,62,66,70],{"title":21,"path":44,"stem":45},"/pdfrest-api-toolkit-container/getting-started","2.pdfrest-api-toolkit-container/1.getting-started",{"title":47,"path":48,"stem":49},"Deploy the Container","/pdfrest-api-toolkit-container/deploy-container-api","2.pdfrest-api-toolkit-container/2.deploy-container-api",{"title":51,"path":52,"stem":53},"Configure pdfRest API Toolkit Container","/pdfrest-api-toolkit-container/configure-container-api","2.pdfrest-api-toolkit-container/3.configure-container-api",{"title":55,"path":56,"stem":57},"Storage Guide","/pdfrest-api-toolkit-container/storage-guide","2.pdfrest-api-toolkit-container/4.storage-guide",{"title":59,"path":60,"stem":61},"Custom Compression Profiles in Container","/pdfrest-api-toolkit-container/custom-compression-profiles","2.pdfrest-api-toolkit-container/5.custom-compression-profiles",{"title":63,"path":64,"stem":65},"Add New Languages for OCR","/pdfrest-api-toolkit-container/adding-new-languages-for-ocr","2.pdfrest-api-toolkit-container/6.adding-new-languages-for-ocr",{"title":67,"path":68,"stem":69},"Logging","/pdfrest-api-toolkit-container/logging","2.pdfrest-api-toolkit-container/6.logging",{"title":71,"path":72,"stem":73},"Monitoring","/pdfrest-api-toolkit-container/monitoring","2.pdfrest-api-toolkit-container/7.monitoring",{"title":75,"icon":76,"path":77,"stem":78,"children":79,"page":36},"On AWS","vscode-icons:file-type-aws","/pdfrest-api-toolkit-on-aws","3.pdfrest-api-toolkit-on-aws",[80,83,87,91,94],{"title":21,"path":81,"stem":82},"/pdfrest-api-toolkit-on-aws/getting-started","3.pdfrest-api-toolkit-on-aws/1.getting-started",{"title":84,"path":85,"stem":86},"Deploy on AWS","/pdfrest-api-toolkit-on-aws/deploy-on-aws","3.pdfrest-api-toolkit-on-aws/2.deploy-on-aws",{"title":88,"path":89,"stem":90},"Configure AWS Deployment","/pdfrest-api-toolkit-on-aws/configure-aws-deployment","3.pdfrest-api-toolkit-on-aws/3.configure-aws-deployment",{"title":25,"path":92,"stem":93},"/pdfrest-api-toolkit-on-aws/faq","3.pdfrest-api-toolkit-on-aws/4.faq",{"title":33,"path":95,"stem":96},"/pdfrest-api-toolkit-on-aws/custom-compression-profiles","3.pdfrest-api-toolkit-on-aws/5.custom-compression-profiles",{"title":98,"icon":99,"path":100,"stem":101,"children":102,"page":36},"API Reference Guides","vscode-icons:file-type-source","/api-reference-guides","4.api-reference-guides",[103],{"title":98,"path":104,"stem":105},"/api-reference-guides/directory","4.api-reference-guides/1.directory",{"title":107,"fields":108,"path":109,"stem":110,"children":111,"page":36},"Additional Guides",{"hidden":13},"/additional-guides","5.additional-guides",[112,115,119],{"title":107,"path":113,"stem":114},"/additional-guides/directory","5.additional-guides/1.directory",{"title":116,"path":117,"stem":118},"Font List","/additional-guides/font-list","5.additional-guides/2.font-list",{"title":120,"path":121,"stem":122},"Acknowledgements","/additional-guides/acknowledgements","5.additional-guides/acknowledgements",{"title":124,"path":125,"stem":126,"children":127,"icon":129,"sidebar":130,"collapse":36,"toc":13},"Release Notes","/release-notes","6.release-notes/1.index",[128],{"title":124,"path":125,"stem":126},"vscode-icons:file-type-git",{"style":131},"tree",{"id":133,"title":71,"body":134,"description":1329,"extension":1330,"head":1331,"links":1331,"meta":1332,"navigation":13,"ogImage":1331,"path":72,"robots":1331,"schemaOrg":1331,"seo":1333,"sitemap":1335,"stem":73,"__hash__":1336},"docs/2.pdfrest-api-toolkit-container/7.monitoring.md",{"type":135,"value":136,"toc":1315},"minimark",[137,142,146,224,249,257,261,296,313,326,330,337,340,360,363,367,387,390,536,592,606,609,619,623,671,674,731,746,763,768,774,781,849,860,866,870,873,965,976,980,992,996,1023,1279,1289,1293,1299,1311],[138,139,141],"h2",{"id":140},"choose-a-monitoring-endpoint","Choose a monitoring endpoint",[143,144,145],"p",{},"The Container provides three monitoring endpoints for API availability and Command-Line Utility (CLU) processing capacity. Use them to check availability, inspect capacity, and decide whether the container should receive more work.",[147,148,149,165],"table",{},[150,151,152],"thead",{},[153,154,155,159,162],"tr",{},[156,157,158],"th",{},"Endpoint",[156,160,161],{},"Purpose",[156,163,164],{},"Response",[166,167,168,190,205],"tbody",{},[153,169,170,177,180],{},[171,172,173],"td",{},[174,175,176],"code",{},"GET /up",[171,178,179],{},"Check API liveness and identify the deployed release.",[171,181,182,185,186,189],{},[174,183,184],{},"200"," with product and release information and ",[174,187,188],{},"status: \"OK\"",".",[153,191,192,197,200],{},[171,193,194],{},[174,195,196],{},"GET /diagnostics",[171,198,199],{},"Inspect available CLU slots and running processes.",[171,201,202,204],{},[174,203,184],{}," with a JSON snapshot of processing capacity and processes.",[153,206,207,212,215],{},[171,208,209],{},[174,210,211],{},"GET /targethealth",[171,213,214],{},"Check processing capacity against health thresholds.",[171,216,217,219,220,223],{},[174,218,184],{}," with an empty body when within thresholds; ",[174,221,222],{},"252"," with an empty body when either threshold is reached.",[143,225,226,227,230,231,234,235,238,239,244,245,248],{},"All three endpoints accept requests without authentication or an ",[174,228,229],{},"Api-Key"," header. Call them on your deployed Container's address. The examples below use ",[174,232,233],{},"http://localhost",", matching the host port ",[174,236,237],{},"80"," in the ",[240,241,243],"a",{"href":242},"/pdfrest-api-toolkit-container/deploy-container-api/#docker-compose","Docker Compose deployment example",". The API listens on port ",[174,246,247],{},"3000"," inside the container; adjust the URL for your deployment.",[143,250,251,252,256],{},"See the ",[240,253,255],{"href":254},"/pdfrest-api-toolkit-container/api-reference-guide/","Container API Reference Guide"," for the endpoint schemas and response details.",[138,258,260],{"id":259},"check-api-availability-with-up","Check API availability with /up",[262,263,268],"pre",{"className":264,"code":265,"language":266,"meta":267,"style":267},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl --silent --show-error --max-time 5 http://localhost/up\n","bash","",[174,269,270],{"__ignoreMap":267},[271,272,275,279,283,286,289,293],"span",{"class":273,"line":274},"line",1,[271,276,278],{"class":277},"sBMFI","curl",[271,280,282],{"class":281},"sfazB"," --silent",[271,284,285],{"class":281}," --show-error",[271,287,288],{"class":281}," --max-time",[271,290,292],{"class":291},"sbssI"," 5",[271,294,295],{"class":281}," http://localhost/up\n",[143,297,298,299,301,302,301,305,308,309,312],{},"A running API returns JSON containing ",[174,300,188],{},", ",[174,303,304],{},"product",[174,306,307],{},"releaseDate",", and ",[174,310,311],{},"version",". Use this endpoint for uptime monitoring and liveness checks, and record the release fields when investigating a deployment issue.",[143,314,315,318,319,321,322,325],{},[174,316,317],{},"/up"," does not run a document-processing operation or assess available CLU capacity. It can return ",[174,320,184],{}," while all processing slots are occupied. Use ",[174,323,324],{},"/targethealth"," to decide whether capacity is available, and a representative document-processing request to verify your complete workflow, including licensing and storage.",[138,327,329],{"id":328},"understand-clu-concurrency","Understand CLU concurrency",[143,331,332,333,336],{},"pdfRest uses Command-Line Utilities (CLUs) to process documents. A CLU execution acquires a processing slot and releases it when the execution finishes. ",[174,334,335],{},"PDFREST_MAX_CLU_CONCURRENCY"," controls how many CLU executions can run at once in a container. This is a limit on utility executions; a single API request can involve multiple processing steps.",[143,338,339],{},"By default, the limit is the CPU parallelism available to the server minus one, with a minimum of one slot. For example, when the server detects four available CPUs, the default is three slots. Set an explicit positive integer if you need a predictable limit for your deployment, and tune it using representative documents and CPU and memory measurements.",[143,341,342,343,346,347,350,351,354,355,359],{},"When all slots are occupied, additional CLU executions wait in the local queue. ",[174,344,345],{},"PDFREST_CLU_SEMAPHORE_WAIT_TIME"," controls how long an execution can wait for a slot before timing out, in seconds, and defaults to ",[174,348,349],{},"180",". This wait is separate from ",[174,352,353],{},"MAX_PROCESS_TIME",", which limits processing time. See ",[240,356,358],{"href":357},"/pdfrest-api-toolkit-container/configure-container-api/#environment-variables","environment variables"," for configuration details.",[143,361,362],{},"Concurrency and waiting work are local to each container. Adding replicas adds separate processing capacity; it does not create one shared queue or concurrency limit.",[138,364,366],{"id":365},"inspect-capacity-with-diagnostics","Inspect capacity with /diagnostics",[262,368,370],{"className":264,"code":369,"language":266,"meta":267,"style":267},"curl --silent --show-error --max-time 5 http://localhost/diagnostics\n",[174,371,372],{"__ignoreMap":267},[271,373,374,376,378,380,382,384],{"class":273,"line":274},[271,375,278],{"class":277},[271,377,282],{"class":281},[271,379,285],{"class":281},[271,381,288],{"class":281},[271,383,292],{"class":291},[271,385,386],{"class":281}," http://localhost/diagnostics\n",[143,388,389],{},"For a container configured with three slots and one running CLU, a response could look like this:",[262,391,395],{"className":392,"code":393,"language":394,"meta":267,"style":267},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"availableCluProcesses\": 2,\n  \"cluProcessCount\": 1,\n  \"cluProcesses\": [\n    {\n      \"cmd\": \"/opt/datalogics/.example-clu\",\n      \"cpu_pct\": 0.1,\n      \"mem_pct\": 0.2\n    }\n  ]\n}\n","json",[174,396,397,403,425,442,457,463,486,503,518,524,530],{"__ignoreMap":267},[271,398,399],{"class":273,"line":274},[271,400,402],{"class":401},"sMK4o","{\n",[271,404,406,409,413,416,419,422],{"class":273,"line":405},2,[271,407,408],{"class":401},"  \"",[271,410,412],{"class":411},"spNyl","availableCluProcesses",[271,414,415],{"class":401},"\"",[271,417,418],{"class":401},":",[271,420,421],{"class":291}," 2",[271,423,424],{"class":401},",\n",[271,426,428,430,433,435,437,440],{"class":273,"line":427},3,[271,429,408],{"class":401},[271,431,432],{"class":411},"cluProcessCount",[271,434,415],{"class":401},[271,436,418],{"class":401},[271,438,439],{"class":291}," 1",[271,441,424],{"class":401},[271,443,445,447,450,452,454],{"class":273,"line":444},4,[271,446,408],{"class":401},[271,448,449],{"class":411},"cluProcesses",[271,451,415],{"class":401},[271,453,418],{"class":401},[271,455,456],{"class":401}," [\n",[271,458,460],{"class":273,"line":459},5,[271,461,462],{"class":401},"    {\n",[271,464,466,469,472,474,476,479,482,484],{"class":273,"line":465},6,[271,467,468],{"class":401},"      \"",[271,470,471],{"class":277},"cmd",[271,473,415],{"class":401},[271,475,418],{"class":401},[271,477,478],{"class":401}," \"",[271,480,481],{"class":281},"/opt/datalogics/.example-clu",[271,483,415],{"class":401},[271,485,424],{"class":401},[271,487,489,491,494,496,498,501],{"class":273,"line":488},7,[271,490,468],{"class":401},[271,492,493],{"class":277},"cpu_pct",[271,495,415],{"class":401},[271,497,418],{"class":401},[271,499,500],{"class":291}," 0.1",[271,502,424],{"class":401},[271,504,506,508,511,513,515],{"class":273,"line":505},8,[271,507,468],{"class":401},[271,509,510],{"class":277},"mem_pct",[271,512,415],{"class":401},[271,514,418],{"class":401},[271,516,517],{"class":291}," 0.2\n",[271,519,521],{"class":273,"line":520},9,[271,522,523],{"class":401},"    }\n",[271,525,527],{"class":273,"line":526},10,[271,528,529],{"class":401},"  ]\n",[271,531,533],{"class":273,"line":532},11,[271,534,535],{"class":401},"}\n",[147,537,538,548],{},[150,539,540],{},[153,541,542,545],{},[156,543,544],{},"Field",[156,546,547],{},"How to use it",[166,549,550,563,574],{},[153,551,552,556],{},[171,553,554],{},[174,555,412],{},[171,557,558,559,562],{},"Number of processing slots currently available for new CLU work. A value of ",[174,560,561],{},"0"," means all slots are occupied.",[153,564,565,569],{},[171,566,567],{},[174,568,432],{},[171,570,571,572,189],{},"Number of running main CLU processes. This is the process count used by ",[174,573,324],{},[153,575,576,580],{},[171,577,578],{},[174,579,449],{},[171,581,582,583,585,586,588,589,591],{},"Details of running CLU processes, including related child processes. Each entry contains the command (",[174,584,471],{},"), CPU usage percentage (",[174,587,493],{},"), and memory usage percentage (",[174,590,510],{},"). The array is empty when no CLU processes are running.",[143,593,594,595,598,599,601,602,605],{},"The process list and slot availability measure different things. ",[174,596,597],{},"cluProcesses.length"," can exceed ",[174,600,432],{}," because the list includes child processes. Slot acquisition and process startup or shutdown also occur at different times, so do not assume that ",[174,603,604],{},"availableCluProcesses + cluProcessCount"," always equals the configured limit.",[143,607,608],{},"Poll each container directly and label measurements by instance or Pod. Polling only a load-balanced address can sample a different container each time and hide a busy instance. Track available slots alongside request latency, errors, and host CPU and memory usage. The response does not include queue length or request wait time; zero available slots alone does not tell you how many requests are waiting.",[143,610,611,614,615,618],{},[174,612,613],{},"/diagnostics"," returns ",[174,616,617],{},"500"," if process diagnostics cannot be retrieved. Treat this as a monitoring failure and inspect the container logs. The process commands can contain arguments and file paths, so keep access to this unauthenticated endpoint within your operational network and handle collected responses accordingly.",[138,620,622],{"id":621},"check-capacity-health-with-targethealth","Check capacity health with /targethealth",[262,624,626],{"className":264,"code":625,"language":266,"meta":267,"style":267},"curl --silent --show-error --max-time 5 \\\n  --output /dev/null --write-out '%{http_code}\\n' \\\n  http://localhost/targethealth\n",[174,627,628,644,666],{"__ignoreMap":267},[271,629,630,632,634,636,638,640],{"class":273,"line":274},[271,631,278],{"class":277},[271,633,282],{"class":281},[271,635,285],{"class":281},[271,637,288],{"class":281},[271,639,292],{"class":291},[271,641,643],{"class":642},"sTEyZ"," \\\n",[271,645,646,649,652,655,658,661,664],{"class":273,"line":405},[271,647,648],{"class":281},"  --output",[271,650,651],{"class":281}," /dev/null",[271,653,654],{"class":281}," --write-out",[271,656,657],{"class":401}," '",[271,659,660],{"class":281},"%{http_code}\\n",[271,662,663],{"class":401},"'",[271,665,643],{"class":642},[271,667,668],{"class":273,"line":427},[271,669,670],{"class":281},"  http://localhost/targethealth\n",[143,672,673],{},"The endpoint compares a diagnostics snapshot against two thresholds:",[147,675,676,691],{},[150,677,678],{},[153,679,680,683,686],{},[156,681,682],{},"Environment variable",[156,684,685],{},"Default",[156,687,688,689],{},"Condition that returns ",[174,690,222],{},[166,692,693,714],{},[153,694,695,700,704],{},[171,696,697],{},[174,698,699],{},"HEALTH_MINIMUM_CLU_CONCURRENCY_LIMIT",[171,701,702],{},[174,703,561],{},[171,705,706,708,709,713],{},[174,707,412],{}," is ",[710,711,712],"strong",{},"less than or equal to"," this value.",[153,715,716,721,724],{},[171,717,718],{},[174,719,720],{},"HEALTH_MAXIMUM_EXECUTING_CLUS",[171,722,723],{},"The effective maximum CLU concurrency.",[171,725,726,708,728,713],{},[174,727,432],{},[710,729,730],{},"greater than or equal to",[143,732,733,734,736,737,739,740,743,744,189],{},"Either condition is enough to return ",[174,735,222],{},". The endpoint returns ",[174,738,184],{}," only when available slots are above the minimum ",[710,741,742],{},"and"," running main CLUs are below the maximum. Both responses have an empty body. If the diagnostics lookup fails, the endpoint returns ",[174,745,617],{},[747,748,749,750,755,756,758,759,762],"warning",{},"Configure capacity health checks to accept ",[710,751,752,753],{},"only HTTP ",[174,754,184],{},". ",[174,757,222],{}," is in the 2xx range but indicates that a capacity threshold has been reached. A check that accepts all 2xx responses, or relies only on ",[174,760,761],{},"curl --fail",", will treat it as successful.",[764,765,767],"h3",{"id":766},"configure-headroom","Configure headroom",[143,769,770,771,189],{},"The health thresholds affect the health response; they do not change the execution limit or stop the API from accepting requests. Set them through the environment variables described in ",[240,772,773],{"href":357},"Configure Container",[143,775,776,777,780],{},"For example, add these values to the ",[174,778,779],{},"environment"," section of your Docker Compose service:",[262,782,786],{"className":783,"code":784,"language":785,"meta":267,"style":267},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","environment:\n  LICENSE_KEY: YOUR-LICENSE-KEY-VALUE-HERE\n  PDFREST_MAX_CLU_CONCURRENCY: \"4\"\n  HEALTH_MINIMUM_CLU_CONCURRENCY_LIMIT: \"1\"\n  HEALTH_MAXIMUM_EXECUTING_CLUS: \"3\"\n","yaml",[174,787,788,796,806,821,835],{"__ignoreMap":267},[271,789,790,793],{"class":273,"line":274},[271,791,779],{"class":792},"swJcz",[271,794,795],{"class":401},":\n",[271,797,798,801,803],{"class":273,"line":405},[271,799,800],{"class":792},"  LICENSE_KEY",[271,802,418],{"class":401},[271,804,805],{"class":281}," YOUR-LICENSE-KEY-VALUE-HERE\n",[271,807,808,811,813,815,818],{"class":273,"line":427},[271,809,810],{"class":792},"  PDFREST_MAX_CLU_CONCURRENCY",[271,812,418],{"class":401},[271,814,478],{"class":401},[271,816,817],{"class":281},"4",[271,819,820],{"class":401},"\"\n",[271,822,823,826,828,830,833],{"class":273,"line":444},[271,824,825],{"class":792},"  HEALTH_MINIMUM_CLU_CONCURRENCY_LIMIT",[271,827,418],{"class":401},[271,829,478],{"class":401},[271,831,832],{"class":281},"1",[271,834,820],{"class":401},[271,836,837,840,842,844,847],{"class":273,"line":459},[271,838,839],{"class":792},"  HEALTH_MAXIMUM_EXECUTING_CLUS",[271,841,418],{"class":401},[271,843,478],{"class":401},[271,845,846],{"class":281},"3",[271,848,820],{"class":401},[143,850,851,852,614,854,856,857,859],{},"With these settings, ",[174,853,324],{},[174,855,222],{}," when one or fewer slots remain, or when three or more main CLUs are running. It returns ",[174,858,184],{}," when more than one slot remains and fewer than three main CLUs are running. This lets a health-aware router stop assigning new work before all four slots are occupied.",[143,861,862,863,865],{},"Choose thresholds that allow an idle container to be healthy. For example, setting the minimum available-slot threshold equal to the concurrency limit makes even an idle container return ",[174,864,222],{},". Raising the maximum executing-CLU threshold above the concurrency limit does not override the available-slot check.",[764,867,869],{"id":868},"use-an-exact-status-check","Use an exact-status check",[143,871,872],{},"For a script or monitoring agent, compare the returned status explicitly and fail on connection errors or timeouts:",[262,874,878],{"className":875,"code":876,"language":877,"meta":267,"style":267},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#!/bin/sh\nstatus=$(curl --silent --show-error --max-time 5 \\\n  --output /dev/null --write-out '%{http_code}' \\\n  http://localhost/targethealth) || exit 1\n[ \"$status\" = \"200\" ]\n","sh",[174,879,880,886,906,923,941],{"__ignoreMap":267},[271,881,882],{"class":273,"line":274},[271,883,885],{"class":884},"sHwdD","#!/bin/sh\n",[271,887,888,891,894,896,898,900,902,904],{"class":273,"line":405},[271,889,890],{"class":642},"status",[271,892,893],{"class":401},"=$(",[271,895,278],{"class":277},[271,897,282],{"class":281},[271,899,285],{"class":281},[271,901,288],{"class":281},[271,903,292],{"class":291},[271,905,643],{"class":642},[271,907,908,910,912,914,916,919,921],{"class":273,"line":427},[271,909,648],{"class":281},[271,911,651],{"class":281},[271,913,654],{"class":281},[271,915,657],{"class":401},[271,917,918],{"class":281},"%{http_code}",[271,920,663],{"class":401},[271,922,643],{"class":642},[271,924,925,928,931,934,938],{"class":273,"line":444},[271,926,927],{"class":281},"  http://localhost/targethealth",[271,929,930],{"class":401},")",[271,932,933],{"class":401}," ||",[271,935,937],{"class":936},"s2Zo4"," exit",[271,939,940],{"class":291}," 1\n",[271,942,943,946,948,951,953,956,958,960,962],{"class":273,"line":459},[271,944,945],{"class":401},"[",[271,947,478],{"class":401},[271,949,950],{"class":642},"$status",[271,952,415],{"class":401},[271,954,955],{"class":401}," =",[271,957,478],{"class":401},[271,959,184],{"class":281},[271,961,415],{"class":401},[271,963,964],{"class":401}," ]\n",[143,966,967,968,970,971,973,974,189],{},"This check exits successfully only for ",[174,969,184],{},". Set the address to the individual container being monitored. For a load balancer, use ",[174,972,324],{}," as the target health path and set its success-code matcher to ",[174,975,184],{},[138,977,979],{"id":978},"integrate-health-checks-with-your-deployment","Integrate health checks with your deployment",[143,981,982,983,985,986,988,989,991],{},"Use ",[174,984,317],{}," for liveness and ",[174,987,324],{}," for capacity-based readiness or routing. A ",[174,990,222],{}," response generally means the container is busy; let its active work finish and use the signal to defer or redirect new work. Restarting a busy container can interrupt document processing.",[764,993,995],{"id":994},"kubernetes-probes","Kubernetes probes",[143,997,998,999,1001,1002,1005,1006,1008,1009,1012,1013,1015,1016,238,1019,418],{},"Kubernetes HTTP probes accept status codes from ",[174,1000,184],{}," through ",[174,1003,1004],{},"399",", including ",[174,1007,222],{},". Use an ",[174,1010,1011],{},"exec"," readiness probe to require exactly ",[174,1014,184],{},". Add the following settings to the pdfRest container entry under ",[174,1017,1018],{},"spec.template.spec.containers",[240,1020,1022],{"href":1021},"/pdfrest-api-toolkit-container/deploy-container-api/#kubernetes","Kubernetes deployment",[262,1024,1026],{"className":783,"code":1025,"language":785,"meta":267,"style":267},"startupProbe:\n  httpGet:\n    path: /up\n    port: 3000\n  periodSeconds: 5\n  timeoutSeconds: 5\n  failureThreshold: 30\nlivenessProbe:\n  httpGet:\n    path: /up\n    port: 3000\n  periodSeconds: 10\n  timeoutSeconds: 5\n  failureThreshold: 3\nreadinessProbe:\n  exec:\n    command:\n      - node\n      - -e\n      - |\n        const http = require('node:http');\n        const request = http.get('http://127.0.0.1:3000/targethealth', (response) => {\n          response.resume();\n          process.exit(response.statusCode === 200 ? 0 : 1);\n        });\n        request.setTimeout(3000, () => request.destroy(new Error('Health check timed out')));\n        request.on('error', () => process.exit(1));\n  periodSeconds: 10\n  timeoutSeconds: 5\n  failureThreshold: 3\n  successThreshold: 2\n",[174,1027,1028,1035,1042,1052,1062,1072,1081,1091,1098,1104,1112,1120,1130,1139,1149,1157,1165,1173,1182,1190,1199,1205,1211,1217,1223,1229,1235,1241,1250,1259,1268],{"__ignoreMap":267},[271,1029,1030,1033],{"class":273,"line":274},[271,1031,1032],{"class":792},"startupProbe",[271,1034,795],{"class":401},[271,1036,1037,1040],{"class":273,"line":405},[271,1038,1039],{"class":792},"  httpGet",[271,1041,795],{"class":401},[271,1043,1044,1047,1049],{"class":273,"line":427},[271,1045,1046],{"class":792},"    path",[271,1048,418],{"class":401},[271,1050,1051],{"class":281}," /up\n",[271,1053,1054,1057,1059],{"class":273,"line":444},[271,1055,1056],{"class":792},"    port",[271,1058,418],{"class":401},[271,1060,1061],{"class":291}," 3000\n",[271,1063,1064,1067,1069],{"class":273,"line":459},[271,1065,1066],{"class":792},"  periodSeconds",[271,1068,418],{"class":401},[271,1070,1071],{"class":291}," 5\n",[271,1073,1074,1077,1079],{"class":273,"line":465},[271,1075,1076],{"class":792},"  timeoutSeconds",[271,1078,418],{"class":401},[271,1080,1071],{"class":291},[271,1082,1083,1086,1088],{"class":273,"line":488},[271,1084,1085],{"class":792},"  failureThreshold",[271,1087,418],{"class":401},[271,1089,1090],{"class":291}," 30\n",[271,1092,1093,1096],{"class":273,"line":505},[271,1094,1095],{"class":792},"livenessProbe",[271,1097,795],{"class":401},[271,1099,1100,1102],{"class":273,"line":520},[271,1101,1039],{"class":792},[271,1103,795],{"class":401},[271,1105,1106,1108,1110],{"class":273,"line":526},[271,1107,1046],{"class":792},[271,1109,418],{"class":401},[271,1111,1051],{"class":281},[271,1113,1114,1116,1118],{"class":273,"line":532},[271,1115,1056],{"class":792},[271,1117,418],{"class":401},[271,1119,1061],{"class":291},[271,1121,1123,1125,1127],{"class":273,"line":1122},12,[271,1124,1066],{"class":792},[271,1126,418],{"class":401},[271,1128,1129],{"class":291}," 10\n",[271,1131,1133,1135,1137],{"class":273,"line":1132},13,[271,1134,1076],{"class":792},[271,1136,418],{"class":401},[271,1138,1071],{"class":291},[271,1140,1142,1144,1146],{"class":273,"line":1141},14,[271,1143,1085],{"class":792},[271,1145,418],{"class":401},[271,1147,1148],{"class":291}," 3\n",[271,1150,1152,1155],{"class":273,"line":1151},15,[271,1153,1154],{"class":792},"readinessProbe",[271,1156,795],{"class":401},[271,1158,1160,1163],{"class":273,"line":1159},16,[271,1161,1162],{"class":792},"  exec",[271,1164,795],{"class":401},[271,1166,1168,1171],{"class":273,"line":1167},17,[271,1169,1170],{"class":792},"    command",[271,1172,795],{"class":401},[271,1174,1176,1179],{"class":273,"line":1175},18,[271,1177,1178],{"class":401},"      -",[271,1180,1181],{"class":281}," node\n",[271,1183,1185,1187],{"class":273,"line":1184},19,[271,1186,1178],{"class":401},[271,1188,1189],{"class":281}," -e\n",[271,1191,1193,1195],{"class":273,"line":1192},20,[271,1194,1178],{"class":401},[271,1196,1198],{"class":1197},"s7zQu"," |\n",[271,1200,1202],{"class":273,"line":1201},21,[271,1203,1204],{"class":281},"        const http = require('node:http');\n",[271,1206,1208],{"class":273,"line":1207},22,[271,1209,1210],{"class":281},"        const request = http.get('http://127.0.0.1:3000/targethealth', (response) => {\n",[271,1212,1214],{"class":273,"line":1213},23,[271,1215,1216],{"class":281},"          response.resume();\n",[271,1218,1220],{"class":273,"line":1219},24,[271,1221,1222],{"class":281},"          process.exit(response.statusCode === 200 ? 0 : 1);\n",[271,1224,1226],{"class":273,"line":1225},25,[271,1227,1228],{"class":281},"        });\n",[271,1230,1232],{"class":273,"line":1231},26,[271,1233,1234],{"class":281},"        request.setTimeout(3000, () => request.destroy(new Error('Health check timed out')));\n",[271,1236,1238],{"class":273,"line":1237},27,[271,1239,1240],{"class":281},"        request.on('error', () => process.exit(1));\n",[271,1242,1244,1246,1248],{"class":273,"line":1243},28,[271,1245,1066],{"class":792},[271,1247,418],{"class":401},[271,1249,1129],{"class":291},[271,1251,1253,1255,1257],{"class":273,"line":1252},29,[271,1254,1076],{"class":792},[271,1256,418],{"class":401},[271,1258,1071],{"class":291},[271,1260,1262,1264,1266],{"class":273,"line":1261},30,[271,1263,1085],{"class":792},[271,1265,418],{"class":401},[271,1267,1148],{"class":291},[271,1269,1271,1274,1276],{"class":273,"line":1270},31,[271,1272,1273],{"class":792},"  successThreshold",[271,1275,418],{"class":401},[271,1277,1278],{"class":291}," 2\n",[143,1280,1281,1282,1288],{},"The startup probe allows time for initialization. Readiness failures remove the Pod from Service traffic while liveness failures can trigger a restart. Tune the example timings for your workload. See the ",[240,1283,1287],{"href":1284,"rel":1285},"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/",[1286],"nofollow","Kubernetes probe documentation"," for probe behavior and settings.",[764,1290,1292],{"id":1291},"multiple-containers-and-alerting","Multiple containers and alerting",[143,1294,1295,1296,1298],{},"Monitor every replica and use several consecutive checks before changing routing or sending an alert. Brief saturation can be normal during a batch. Sustained ",[174,1297,222],{}," responses, increasing request latency, or concurrency-wait timeouts can indicate that you need to reduce incoming work, tune concurrency, or add capacity. These endpoints report health; your monitoring and deployment systems must implement alerts, routing, and scaling actions.",[143,1300,1301,1302,1306,1307,1310],{},"Before routing document-processing requests across replicas, configure ",[240,1303,1305],{"href":1304},"/pdfrest-api-toolkit-container/storage-guide/#shared-storage-for-any-number-of-containers","shared storage"," so every container can access the same input and output files. These health endpoints do not verify shared-storage access, free disk space, or successful completion of a document workflow. Monitor those separately and use the ",[240,1308,55],{"href":1309},"/pdfrest-api-toolkit-container/storage-guide/"," to plan file retention and volume configuration.",[1312,1313,1314],"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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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":267,"searchDepth":274,"depth":405,"links":1316},[1317,1318,1319,1320,1321,1325],{"id":140,"depth":405,"text":141},{"id":259,"depth":405,"text":260},{"id":328,"depth":405,"text":329},{"id":365,"depth":405,"text":366},{"id":621,"depth":405,"text":622,"children":1322},[1323,1324],{"id":766,"depth":427,"text":767},{"id":868,"depth":427,"text":869},{"id":978,"depth":405,"text":979,"children":1326},[1327,1328],{"id":994,"depth":427,"text":995},{"id":1291,"depth":427,"text":1292},"Use the up, diagnostics, and targethealth endpoints to monitor pdfRest API Toolkit Container health and available processing capacity.","md",null,{},{"title":1334,"description":1329},"Monitoring | pdfRest API Toolkit Container",{"loc":72},"m0xvFiFNWNvFq4hftCtmIItB5h5-fXJD2c11LrdTwcM",[1338,1340],{"title":67,"path":68,"stem":69,"description":1339,"children":-1},"Configure, collect, and interpret structured logs from the pdfRest API Toolkit Container.",{"title":21,"path":81,"stem":82,"description":1341,"children":-1},"Get started quickly with the pdfRest API Toolkit on AWS to integrate PDF processing into your projects.",1793284554152]