{"id":52500,"date":"2025-09-07T05:19:54","date_gmt":"2025-09-07T05:19:54","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=52500"},"modified":"2025-09-07T05:19:54","modified_gmt":"2025-09-07T05:19:54","slug":"elastic-elastic-apm-java-agent-on-apache-tomcat","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/elastic-elastic-apm-java-agent-on-apache-tomcat\/","title":{"rendered":"Elastic: Elastic APM Java agent on Apache Tomcat"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1) Prerequisites<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Elastic Cloud deployment<\/strong> with Observability enabled (free trial works).<br>In the Elastic Cloud console, you\u2019ll later copy:\n<ul class=\"wp-block-list\">\n<li><strong>APM Server URL<\/strong> (looks like <code>https:\/\/&lt;hash>.apm.&lt;region>.cloud.es.io:443<\/code>)<\/li>\n\n\n\n<li><strong>Secret token<\/strong> <em>or<\/em> an <strong>APM Agent key (API key)<\/strong>. (<a href=\"https:\/\/www.elastic.co\/guide\/en\/apm\/get-started\/7.12\/install-and-run.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>, <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/spring-apps\/basic-standard\/how-to-elastic-apm-java-agent-monitor?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Microsoft Learn<\/a>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Tomcat<\/strong> on Linux (e.g., <code>\/opt\/tomcat<\/code> or distro path like <code>\/usr\/share\/tomcat<\/code>).<\/li>\n\n\n\n<li><strong>Java 8+<\/strong> (Java 17\/21 are fine); outbound HTTPS (443) to <code>*.cloud.es.io<\/code>.<\/li>\n\n\n\n<li>Shell access (sudo) to install files and restart Tomcat.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>About auth<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Secret token<\/strong>: simple to start, sent in plaintext over TLS (fine when HTTPS). (<a href=\"https:\/\/www.elastic.co\/docs\/solutions\/observability\/apm\/secret-token?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><strong>APM Agent key (API key)<\/strong>: preferred for production; create in Kibana or via API for least-privilege agent auth. (<a href=\"https:\/\/www.elastic.co\/guide\/en\/observability\/8.19\/apm-agent-key-api.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2) Get your APM endpoint &amp; token\/key from Elastic Cloud<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open your Elastic Cloud deployment<\/li>\n\n\n\n<li>Go to <strong>Observability \u2192 APM<\/strong> (or <strong>APM &amp; Fleet<\/strong>), copy the <strong>APM Server URL<\/strong> and either the <strong>Secret token<\/strong> or generate an <strong>APM Agent key<\/strong>. (<a href=\"https:\/\/www.elastic.co\/guide\/en\/apm\/get-started\/7.12\/install-and-run.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>, <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/spring-apps\/basic-standard\/how-to-elastic-apm-java-agent-monitor?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Microsoft Learn<\/a>)<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3) Download the Elastic APM Java Agent<\/h1>\n\n\n\n<p>Create a directory for the agent and download the current jar:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">sudo mkdir -p \/opt\/elastic\/apm\n# (Replace <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span> with the latest, e.g., 1.46.0)\nsudo curl -L -o \/opt\/elastic\/apm\/elastic-apm-agent-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>.jar \\\n  \"https:\/\/search.maven.org\/remotecontent?filepath=co\/elastic\/apm\/elastic-apm-agent\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>\/elastic-apm-agent-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>.jar\"\nsudo chmod 644 \/opt\/elastic\/apm\/elastic-apm-agent-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>.jar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>The agent jar is published by Elastic; latest versions and source are here if you need to verify: <strong>elastic\/apm-agent-java<\/strong>. (<a href=\"https:\/\/github.com\/elastic\/apm-agent-java?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>)<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4) (Recommended) Keep credentials out of <code>ps<\/code> output<\/h1>\n\n\n\n<p>Create a tiny env file readable only by root\/Tomcat that holds your token or API key:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Pick ONE: secret token OR API key<\/span>\n<span class=\"hljs-comment\"># Secret token variant<\/span>\nsudo bash -c <span class=\"hljs-string\">'cat &gt;\/etc\/elastic-apm.env'<\/span> &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\nELASTIC_APM_SECRET_TOKEN=YOUR_SECRET_TOKEN_HERE\n<span class=\"hljs-comment\"># or, API key variant (preferred)<\/span>\n<span class=\"hljs-comment\"># ELASTIC_APM_API_KEY=YOUR_API_KEY_HERE<\/span>\nEOF\nsudo chmod <span class=\"hljs-number\">600<\/span> \/etc\/elastic-apm.env\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You\u2019ll reference this file from <code>setenv.sh<\/code> so the secrets don\u2019t appear in process lists.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5) Wire the agent into Tomcat (setenv.sh)<\/h1>\n\n\n\n<p>Tomcat reads a <strong><code>setenv.sh<\/code><\/strong> (same folder as <code>catalina.sh<\/code>) on startup. Create it if missing.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Find your Tomcat base; examples:<\/span>\n<span class=\"hljs-comment\"># export CATALINA_HOME=\/opt\/tomcat<\/span>\n<span class=\"hljs-comment\"># or distro paths like \/usr\/share\/tomcat or \/usr\/share\/tomcat9<\/span>\ncd <span class=\"hljs-string\">\"$CATALINA_HOME\/bin\"<\/span>\n\nsudo bash -c <span class=\"hljs-string\">'cat &gt;setenv.sh'<\/span> &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\n<span class=\"hljs-comment\"># Load secrets<\/span>\n&#91; -f \/etc\/elastic-apm.env ] &amp;&amp; . \/etc\/elastic-apm.env\n\n<span class=\"hljs-comment\"># Path to the agent<\/span>\nAGENT_JAR=<span class=\"hljs-string\">\"\/opt\/elastic\/apm\/elastic-apm-agent-&lt;version&gt;.jar\"<\/span>\n\n<span class=\"hljs-comment\"># Core APM config (minimal)<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -javaagent:${AGENT_JAR}\"<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.service_name=my-tomcat-app\"<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.server_url=https:\/\/&lt;your-cloud-apm-endpoint&gt;:443\"<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.environment=prod\"<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.application_packages=com.yourcompany,org.example\"<\/span>\n\n<span class=\"hljs-comment\"># Auth: use ONE of the following (API key preferred)<\/span>\n<span class=\"hljs-comment\"># Secret token<\/span>\n&#91; -n <span class=\"hljs-string\">\"$ELASTIC_APM_SECRET_TOKEN\"<\/span> ] &amp;&amp; \\\n  CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.secret_token=${ELASTIC_APM_SECRET_TOKEN}\"<\/span>\n<span class=\"hljs-comment\"># API key<\/span>\n&#91; -n <span class=\"hljs-string\">\"$ELASTIC_APM_API_KEY\"<\/span> ] &amp;&amp; \\\n  CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.api_key=${ELASTIC_APM_API_KEY}\"<\/span>\n\n<span class=\"hljs-comment\"># Useful production defaults \/ hygiene<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.capture_body=errors\"<\/span>\nCATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.global_labels=org=MyCo,team=platform,region=jp\"<\/span>\n<span class=\"hljs-comment\"># (Log correlation is ON by default in recent agent versions)<\/span>\n<span class=\"hljs-comment\"># CATALINA_OPTS=\"$CATALINA_OPTS -Delastic.apm.log_level=info\"<\/span>\n\nexport CATALINA_OPTS\nEOF\n\nsudo chmod +x setenv.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Why these options?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>service_name<\/code>, <code>server_url<\/code>, <code>application_packages<\/code> are the key minimums for Java agent. (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/configuration?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><code>global_labels<\/code> adds useful searchable tags across all APM events. (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/config-core?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><strong>Log correlation<\/strong> with your logs is enabled by default in agent \u2265 1.30 (no extra flag needed). (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/logs?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>If you prefer <strong>central configuration<\/strong> (set most options from Kibana APM UI), that\u2019s also supported and can override local settings. (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/configuration?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6) Restart Tomcat<\/h1>\n\n\n\n<p>For a tarball install:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$CATALINA_HOME\/bin\/shutdown.sh || <span class=\"hljs-keyword\">true<\/span>\n$CATALINA_HOME\/bin\/startup.sh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For a systemd install:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sudo systemctl daemon-reload\nsudo systemctl restart tomcat    <span class=\"hljs-comment\"># or tomcat9, etc.<\/span>\nsudo journalctl -u tomcat -f\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You should see the agent initialize in <code>catalina.out<\/code>\/service logs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7) Generate traffic &amp; verify in Kibana<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hit a few app endpoints (e.g., your web app pages or APIs).<\/li>\n\n\n\n<li>In <strong>Kibana \u2192 Observability \u2192 APM \u2192 Services<\/strong>, your <code>service_name<\/code> should appear with transactions and traces. (<a href=\"https:\/\/www.elastic.co\/guide\/en\/apm\/get-started\/7.12\/install-and-run.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n<\/ul>\n\n\n\n<p><strong>Connectivity check (optional):<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Quick probe that APM server is up (expects 200)<\/span>\ncurl -s -o \/dev\/<span class=\"hljs-keyword\">null<\/span> -w <span class=\"hljs-string\">\"%{http_code}\\n\"<\/span> https:<span class=\"hljs-comment\">\/\/&lt;your-cloud-apm-endpoint&gt;\/<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The APM <strong>Server Information<\/strong> endpoint returns 200 when reachable. (Auth is still required by the agent for sending data.) (<a href=\"https:\/\/www.elastic.co\/docs\/solutions\/observability\/apm\/apm-server-information-api?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8) Production hardening &amp; nice-to-haves<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use an APM Agent key<\/strong> instead of a secret token for better control\/rotation. (<a href=\"https:\/\/www.elastic.co\/guide\/en\/observability\/8.19\/apm-agent-key-api.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><strong>Sampling<\/strong>: adjust volume vs. detail <code>-Delastic.apm.transaction_sample_rate=0.2 # 20% traces<\/code><\/li>\n\n\n\n<li><strong>Sensitive data<\/strong>: keep request bodies off by default (<code>capture_body=off<\/code>) or restrict to <code>errors<\/code>\/<code>transactions<\/code> only; you can fine-tune per endpoint in Kibana later. (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/configuration?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><strong>Proxies \/ firewalls<\/strong>: ensure egress to your Cloud APM URL:443; add standard JVM proxy flags if needed (<code>-Dhttps.proxyHost<\/code>, <code>-Dhttps.proxyPort<\/code>).<\/li>\n\n\n\n<li><strong>Multiple apps on one Tomcat<\/strong>: use separate <code>service_name<\/code> per instance (simplest via separate start wrappers\/env). (<a href=\"https:\/\/stackoverflow.com\/questions\/53993580\/java-apm-agent-with-multiple-tomcats?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Stack Overflow<\/a>)<\/li>\n\n\n\n<li><strong>Central config<\/strong>: once data flows, you can flip tuning options in Kibana APM without restarts. (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/configuration?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9) Troubleshooting checklist<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Agent loaded?<\/strong> Look for \u201cElastic APM agent initialized\u201d in Tomcat logs.<\/li>\n\n\n\n<li><strong>Auth errors?<\/strong> Re-copy the <strong>Secret token<\/strong> or <strong>APM Agent key<\/strong> from Kibana; mismatches are the most common issue. (<a href=\"https:\/\/www.elastic.co\/docs\/solutions\/observability\/apm\/secret-token?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><strong>Endpoint reachable?<\/strong> <code>curl<\/code> the APM server URL as above; if blocked, fix firewall\/egress rules. (<a href=\"https:\/\/www.elastic.co\/docs\/solutions\/observability\/apm\/apm-server-information-api?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n\n\n\n<li><strong>Verbose logs (temporarily):<\/strong> <code>CATALINA_OPTS=\"$CATALINA_OPTS -Delastic.apm.log_level=debug\"<\/code><\/li>\n\n\n\n<li><strong>Handshake\/SSL issues?<\/strong> The agent uses your JVM CA truststore; ensure up-to-date CA certificates.<\/li>\n\n\n\n<li><strong>No services showing?<\/strong> Make sure <code>service_name<\/code> is set and generate a few real requests. (<a href=\"https:\/\/www.elastic.co\/docs\/reference\/apm\/agents\/java\/configuration?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noopener\">Elastic<\/a>)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10) Copy-paste example (using your values)<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Note:<\/strong> replace placeholder values; keep your token\/key secret.<\/p>\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \/opt\/tomcat\/bin\/setenv.sh (snippet)<\/span>\nexport CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -javaagent:\/opt\/elastic\/apm\/elastic-apm-agent-&lt;version&gt;.jar\"<\/span>\nexport CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.service_name=my-service-name\"<\/span>\nexport CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.server_url=https:\/\/fb97fae75f1b43b4b6ccfc4921e8b13d.apm.us-central1.gcp.cloud.es.io:443\"<\/span>\nexport CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.environment=my-environment\"<\/span>\nexport CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.application_packages=org.example\"<\/span>\n<span class=\"hljs-comment\"># ONE of the following:<\/span>\nexport CATALINA_OPTS=<span class=\"hljs-string\">\"$CATALINA_OPTS -Delastic.apm.secret_token=********\"<\/span>\n<span class=\"hljs-comment\"># export CATALINA_OPTS=\"$CATALINA_OPTS -Delastic.apm.api_key=********\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>That\u2019s it!<\/strong> Once Tomcat restarts and traffic hits your app, you\u2019ll see your service in <strong>Kibana \u2192 APM<\/strong> with traces, spans, errors, and metrics.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1) Prerequisites 2) Get your APM endpoint &amp; token\/key from Elastic Cloud 3) Download the Elastic APM Java Agent Create a directory for the agent and download the current jar:&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-52500","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/52500","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=52500"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/52500\/revisions"}],"predecessor-version":[{"id":52501,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/52500\/revisions\/52501"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=52500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=52500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=52500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}