The standalone health check snippet is a small version of the full health check that is included in the RUM JavaScript. You can use it as sanity check to verify the health of the browser environment and detect issues could prevent the RUM JavaScript from working perfectly. It includes a subset of checks that are able to run without the RUM JavaScript context.
Paste the snippet into the browser developer console on the target page.
RUM JavaScript already running? If a RUM JavaScript is already active on the page, the snippet automatically detects it and delegates to the full RUM JavaScript health check. Note that the standalone health check covers fewer checks than the full RUM JavaScript health check.
"use strict";(()=>{var C="RUM JavaScript config (see details)",d="RUM JavaScript is running with version: ";var _e="https://dt-url.net/af03atz",le={Error:"\u274C",Warning:"\u26A0\uFE0F",Info:"\u2139\uFE0F",Verbose:"\u{1F50E}"},ue={Error:"action may be required",Warning:"review recommended",Info:"no action needed",Verbose:"verbose details"},Se={Error:"background:#d32f2f;color:#fff;padding:1px 5px;border-radius:3px;font-weight:bold",Warning:"background:#f9a825;color:#000;padding:1px 5px;border-radius:3px;font-weight:bold",Info:"background:#1976d2;color:#fff;padding:1px 5px;border-radius:3px",Verbose:"background:#757575;color:#fff;padding:1px 5px;border-radius:3px"};function R(e,t){Ne(t),pe(e)}function pe(e){let t=Ie(e.filter(fe));u(t,"Error",!1),u(t,"Warning",!1),u(t,"Info",!0),u(t,"Verbose",!0),ge(e)}function fe(e){return e.text!==C&&!e.text.includes(d)}var T="background:#00b4a0;color:#fff;font-size:14px;font-weight:bold;padding:6px 16px;border-radius:4px 4px 0 0";function Ne(e){console.log(`
%c Dynatrace RUM \u2014 Standalone Environment Check `,T),console.log("%c Snippet v1.347.4.20260902-154543"+(e?"":" | No agent detected"),"background:#007a6e;color:#fff;font-size:11px;padding:4px 16px;border-radius:0 0 4px 4px")}function Ie(e){let t={Error:[],Warning:[],Info:[],Verbose:[]};for(let o of e)t[o.severity].push(o);return t}function u(e,t,o){let n=e[t];if(n.length===0)return;let r=`%c${t} (${n.length})%c \u2014 ${ue[t]}`,i=Se[t];o?console.groupCollapsed(r,i,""):console.group(r,i,"");let s=le[t];for(let c of n)Te(c,s);console.groupEnd()}function Te(e,t){let o=`${_e}#${e.code}`;console.groupCollapsed(` ${t} ${e.text}`),console.log(o),console.groupEnd()}function ge(e){console.log(`
%c \u2139 Need help? %c
Right-click the array, copy the object, and include it in your support request or RFA ->`,"background:#0b5394;color:#fff;padding:2px 8px;border-radius:3px;font-weight:bold","",e,`
`)}function h(e){let t=new Map;if(!e)return t;for(let o of e.split(";")){let n=o.trim();if(!n)continue;let r=n.indexOf("=");if(r<0)continue;let i=n.substring(0,r);!i||t.has(i)||t.set(i,{value:n.substring(r+1)})}return t}function g(e,t,o){let n=`${e}=${t};samesite=Lax`;return location.protocol==="https:"&&(n+=";secure"),n+=";path=/",o!==void 0&&(n+=`;max-age=${o}`),n}function A(e){return g(e,"",0)}var x="dtCookie",O="dtPC",b="rxvt",y="rxVisitor",P="dtSa",D="dtSR",M="dTValidationCookie";var v="__dtCookie",k="dtDisabled",G="dtsrVID";var w="dtSN_",L="dtUSR_",F="dtOFF_",H="dtCM_",U="dtCFG_";var $="dtTAB_",V="dtTabUnload";function B(e){return e+""}var p="dtHCTestVal42",m=500,me=36,Ce=2,Re=8,a={CROSS_DOMAIN_SESSION:v,DISABLED:k,PAGE_CONTEXT:O,SESSION:x,SOURCE_ACTION:P,SR:D,SR_VID:G,VISIT_TIMEOUT:b,VISITOR:y},S=[w,L,F,H,M,U,$,V],W=[a.SESSION,a.PAGE_CONTEXT,a.SOURCE_ACTION,a.VISITOR,a.VISIT_TIMEOUT,a.SR,a.SR_VID,a.DISABLED,a.CROSS_DOMAIN_SESSION];function he(e){let t="";for(;t.length<e;)t+=Math.random().toString(me).slice(Ce);return t.slice(0,e)}function _(e,t){return e.endsWith("_")?`${e}${t}`:`${e}_${t}`}function Ae(e){return new Promise(t=>{setTimeout(t,e)})}var xe={missingCode:-200,modifiedCode:-201,missing:e=>`Cookie "${e}" could not be set. Possible causes: cookies are disabled, blocked by browser settings, page configuration, or name-pattern-based cookie blocking.`,modified:(e,t)=>`Cookie "${e}" was set but its value was modified (expected "${p}", got "${t}"). Possible causes: cookie encoding issues, browser extensions, or content security policies.`},Oe={missingCode:-202,modifiedCode:-203,missing:e=>`Cookie "${e}" was set but not retained after ${m}ms. Possible causes: cookies cleared by a script, browser extension, or name-pattern-based cookie blocking.`,modified:(e,t)=>`Cookie "${e}" was retained after ${m}ms but its value was modified (expected "${p}", got "${t}"). Possible causes: cookie tampering, encoding issues, or browser extensions.`};function X(e,t,o,n){let r=[],i=o.parseCookieString(document.cookie);for(let s of e){let c=i.get(s)?.value;c===void 0?r.push({code:t.missingCode,text:t.missing(s),severity:n}):c!==p&&r.push({code:t.modifiedCode,text:t.modified(s,c),severity:n})}return r}function be(e,t,o){return[...[...S,...W].flatMap(r=>[_(r,"hc"),_(r,o)]),...S.map(r=>_(_(r,`${e}_${t}`),"hc"))]}function ye(e,t,o){let n=[...S,...W,...S.map(r=>_(r,`${e}_${t}`))];try{let r=o.parseCookieString(document.cookie);return n.filter(i=>!r.has(i))}catch{return n}}async function j(e,t,o,n){let r="Info";n===void 0?r="Warning":n==="cookies"&&(r="Error");let i=be(e,t,he(Re)),s=ye(e,t,o),c=[...i,...s],l=[];try{c.forEach(I=>{document.cookie=o.serializeCookie(I,p)});let E=X(c,xe,o,r);l.push(...E),s.forEach(I=>{try{document.cookie=o.serializeCookieDeletion(I)}catch{}}),E.length===0&&(await Ae(m),l.push(...X(i,Oe,o,r)))}catch(E){l.push({code:-204,text:`Cookie access threw an error (${E instanceof Error?E.message:B(E)}). This may occur in sandboxed iframes or restricted browser contexts.`,severity:"Error"})}finally{try{c.forEach(E=>{document.cookie=o.serializeCookieDeletion(E)})}catch{}}return l}function Pe(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement||e instanceof HTMLButtonElement}function De(){let e=new Set,t=HTMLFormElement.prototype;for(;t&&t!==Object.prototype;)Object.getOwnPropertyNames(t).forEach(o=>e.add(o)),t=Object.getPrototypeOf(t);return e.delete("constructor"),e}function Me(e,t){let o=e[t];if(!Pe(o))return!1;let n=o,r=HTMLElement.prototype.getAttribute.call(n,"name"),i=HTMLElement.prototype.getAttribute.call(n,"id");return r===t||i===t}function ve(e,t){let o=HTMLFormElement.prototype.getAttribute.call(e,"id"),n=HTMLFormElement.prototype.getAttribute.call(e,"name");return o?`form#${o}`:n?`form[name="${n}"]`:`form[${t}]`}function ke(e){let t=De(),o=[];for(let n of t)try{Me(e,n)&&o.push(n)}catch{}return o.sort()}function Ge(e,t){let o=ke(e);return o.length===0?null:{formIdentifier:ve(e,t),overriddenProperties:o}}function we(e){let t=e.overriddenProperties.join(", ");return{code:-400,text:`Form "${e.formIdentifier}" has native DOM properties overridden by named form controls: ${t}. This can cause issues with RUM data collection. Consider renaming form controls to avoid these property names.`,severity:"Warning"}}function z(){let e=[];return document.querySelectorAll("form").forEach((o,n)=>{if(!(o instanceof HTMLFormElement))return;let r=Ge(o,n);r&&e.push(we(r))}),e}var f="__zone_symbol__OriginalDelegate";function J(){let e=globalThis.MutationObserver;if(Fe(e))return f in e?[{code:-701,severity:"Warning",text:`MutationObserver has been overridden by zone.js (detected via ${f}).`}]:[];let t=Le(e);return t?[{code:-701,severity:"Warning",text:`MutationObserver has been overridden by zone.js (detected via ${t.property}).`}]:[{code:-700,severity:"Warning",text:"MutationObserver has been overridden by a non-native, non-zone.js implementation."}]}function Le(e){let t=window.Zone?.__symbol__?.("MutationObserver");if(!t)return;let o=window[t];if(!o)return;if(o[f])return{property:`Zone.__symbol__("MutationObserver").${f}`};if(o!==e)return{property:'Zone.__symbol__("MutationObserver")'}}function Fe(e){return typeof e=="function"&&/{\s+\[native code]/.test(Function.prototype.toString.call(e))}function K(e){let t=function(...o){return t=He,e.apply(this,o)};return function(...o){return t.apply(this,o)}}function He(...e){}var Ue=30,Y="DYNATRACE_RUM_SNIPPET_REJECTION_TEST";async function Z(){let e=[],t=$e(),o=!1;try{await Promise.reject(Y)}catch{o=!0}return o||e.push({code:-1100,text:"Rejected Promise not caught! This can cause all sort of problems!",severity:"Error"}),e.push(...await t),e}function $e(){return new Promise(function(e){let t=window.console.error;window.console.error=i;let o=()=>{window.console.error=t},n=setTimeout(function(){r([])},Ue),r=K(function(s){e(s),o(),clearTimeout(n)});function i(s){typeof s!="string"||s!==Y||(t.call(this,s),r([{code:-1101,text:"Rejected Promises still get logged even if they are in a try & catch block! This is NOT the normal behavior and could cause actually handled promise rejections to show up as unhandled promise rejections in the console. (likely caused by zone.js)",severity:"Warning"}]))}})}var q=/function (.*)\(\) {[\t\n\r ]+\[native code][\t\n\r ]+}/;function Q(e){let t=window;for(let o of e.split(".")){if(t===null||typeof t!="object"&&typeof t!="function")return;t=t[o]}return t}function ee(e){try{return Function.prototype.toString.call(e)}catch{return}}function te(){return q.test(Function.prototype.toString.toString())}function oe(e,t){let o=q.exec(e);if(!o)return!1;let n=Ve(t.name.split("."));return!o[1]||o[1]===n}function Ve(e){return e[e.length-1]}var ne=typeof globalThis<"u"?globalThis:typeof window<"u"?window:void 0;var ut=ne.navigator;var re="dT_",ie="DT_RUM",se="dynatrace",ce="dtrum";var Be=[se,re,ce,ie];function ae(){return Be.filter(t=>document.getElementById(t)!==null).map(t=>({code:-900,text:`An element with ID "${t}" was found on the page. This ID is reserved by the RUM JavaScript agent and will cause functionality issues! Remove this ID from the element.`,severity:"Error"}))}var Xe=`[{"name":"Map.prototype.delete"},{"name":"Map.prototype.values"},{"name":"String.prototype.includes"},{"name":"Promise.prototype.then"},{"name":"Promise.prototype.catch"},{"name":"EventTarget.prototype.addEventListener"},{"name":"EventTarget.prototype.removeEventListener"},{"name":"Array.prototype.push"},{"name":"Array.prototype.reduce"},{"name":"Array.prototype.pop"},{"name":"Array.prototype.forEach"},{"name":"Performance.prototype.getEntriesByType"},{"name":"Document.prototype.addEventListener"},{"name":"Window.prototype.addEventListener"},{"name":"Document.prototype.removeEventListener"},{"name":"Window.prototype.removeEventListener"},{"name":"Object.assign"},{"name":"RegExp.prototype.test"},{"name":"Set","isConstructor":true},{"name":"fetch"},{"name":"Function.prototype.apply"},{"name":"String.prototype.toString"},{"name":"AbortSignal.prototype.addEventListener"},{"name":"Set.prototype.add"},{"name":"AbortSignal.prototype.removeEventListener"},{"name":"Set.prototype.delete"},{"name":"Set.prototype.forEach"},{"name":"Set.prototype.clear"},{"name":"Performance.prototype.now"},{"name":"Headers","isConstructor":true},{"name":"Headers.prototype.get"},{"name":"Headers.prototype.set"},{"name":"Array.prototype.map"},{"name":"Function.prototype.bind"},{"name":"String.prototype.split"},{"name":"Map","isConstructor":true},{"name":"Map.prototype.get"},{"name":"Map.prototype.set"},{"name":"String.prototype.charAt"},{"name":"String.prototype.substring"},{"name":"Navigation.prototype.addEventListener"},{"name":"Navigation.prototype.removeEventListener"},{"name":"URL","isConstructor":true},{"name":"Document.prototype.getElementById"},{"name":"Math.floor"},{"name":"Array.prototype.unshift"},{"name":"Math.min"},{"name":"AbortController.prototype.abort"},{"name":"Promise","isConstructor":true},{"name":"AbortSignal.timeout"},{"name":"AbortController","isConstructor":true},{"name":"setTimeout"},{"name":"DOMException","isConstructor":true},{"name":"String.prototype.toUpperCase"},{"name":"Map.prototype.forEach"},{"name":"Map.prototype.clear"},{"name":"String.prototype.replace"},{"name":"Map.prototype.has"},{"name":"Error","isConstructor":true},{"name":"Array.prototype.filter"},{"name":"Promise.all"},{"name":"Math.max"},{"name":"WeakSet","isConstructor":true},{"name":"Array.prototype.indexOf"},{"name":"Array.prototype.splice"},{"name":"WeakSet.prototype.has"},{"name":"clearTimeout"},{"name":"Array.prototype.find"},{"name":"Array.from"},{"name":"Array.prototype.includes"},{"name":"WeakSet.prototype.add"},{"name":"Array.prototype.sort"},{"name":"Set.prototype.has"},{"name":"Math.ceil"},{"name":"PerformanceObserver","isConstructor":true},{"name":"PerformanceObserverEntryList.prototype.getEntries"},{"name":"PerformanceObserver.prototype.observe"},{"name":"PerformanceObserver.prototype.disconnect"},{"name":"String.prototype.startsWith"},{"name":"Object.entries"},{"name":"Array.prototype.join"},{"name":"Object.fromEntries"},{"name":"Array.prototype.some"},{"name":"JSON.stringify"},{"name":"Array.prototype.shift"},{"name":"Object.freeze"},{"name":"Array.isArray"},{"name":"JSON.parse"},{"name":"VisualViewport.prototype.addEventListener"},{"name":"VisualViewport.prototype.removeEventListener"},{"name":"Number.isNaN"},{"name":"Object.prototype.toString"},{"name":"String.prototype.match"},{"name":"Object.defineProperties"},{"name":"Event.prototype.stopPropagation"},{"name":"Event.prototype.stopImmediatePropagation"},{"name":"Event.prototype.preventDefault"},{"name":"Date.now"},{"name":"XMLHttpRequest","isConstructor":false},{"name":"Reflect.construct"},{"name":"Function.prototype.toString"},{"name":"Function.toString"},{"name":"Array.prototype.concat"},{"name":"Symbol.for"},{"name":"Proxy","isConstructor":true},{"name":"Object.keys"},{"name":"Promise.race"},{"name":"queueMicrotask"},{"name":"Array.prototype.every"},{"name":"Number.prototype.toString"},{"name":"Number.parseFloat"},{"name":"Number.isInteger"},{"name":"Array.prototype.flatMap"},{"name":"Array.prototype.slice"},{"name":"console.warn"},{"name":"String.prototype.lastIndexOf"},{"name":"TextEncoder","isConstructor":true},{"name":"TextEncoder.prototype.encode"},{"name":"Uint8Array","isConstructor":true},{"name":"ArrayBuffer.prototype.slice"},{"name":"Promise.resolve"},{"name":"Blob","isConstructor":true},{"name":"Navigator.prototype.sendBeacon"},{"name":"encodeURIComponent"},{"name":"Response.prototype.json"},{"name":"SyntaxError","isConstructor":true},{"name":"String.prototype.toLowerCase"},{"name":"Element.prototype.getAttribute"},{"name":"String.prototype.trim"},{"name":"String.prototype.indexOf"},{"name":"String.prototype.endsWith"},{"name":"decodeURIComponent"},{"name":"String.prototype.codePointAt"},{"name":"String.prototype.charCodeAt"},{"name":"String.prototype.padStart"},{"name":"String.prototype.replaceAll"},{"name":"String.prototype.slice"},{"name":"postMessage"},{"name":"Array.prototype.reverse"},{"name":"String.prototype.localeCompare"},{"name":"Document.prototype.createElement"},{"name":"Element.prototype.setAttribute"},{"name":"Node.prototype.appendChild"},{"name":"NamedNodeMap.prototype.getNamedItem"},{"name":"Promise.prototype.finally"},{"name":"Math.round"},{"name":"Storage.prototype.getItem"},{"name":"Storage.prototype.setItem"},{"name":"Storage.prototype.removeItem"},{"name":"Storage.prototype.key"},{"name":"Function.prototype.call"},{"name":"Object.create"},{"name":"Object.setPrototypeOf"},{"name":"Object.defineProperty"},{"name":"console.log"},{"name":"console.error"},{"name":"setInterval"},{"name":"clearInterval"},{"name":"Object.values"},{"name":"RegExp.prototype.exec"},{"name":"CustomEvent","isConstructor":true},{"name":"EventTarget.prototype.dispatchEvent"},{"name":"Node.prototype.getRootNode"},{"name":"Number.isFinite"},{"name":"Promise.reject"},{"name":"String.fromCharCode"},{"name":"Math.pow"},{"name":"Array.prototype.fill"},{"name":"Math.abs"},{"name":"Crypto.prototype.getRandomValues"},{"name":"RegExp","isConstructor":true},{"name":"Object.prototype.hasOwnProperty"},{"name":"Array.prototype.findLast"},{"name":"ReportingObserver.prototype.observe"},{"name":"ReportingObserver.prototype.disconnect"},{"name":"Number.prototype.toFixed"},{"name":"Performance.prototype.getEntriesByName"},{"name":"document.querySelector"},{"name":"XMLHttpRequest.prototype.getResponseHeader"},{"name":"MutationObserver.prototype.observe"},{"name":"MutationObserver.prototype.disconnect"},{"name":"Element.prototype.hasAttribute"},{"name":"WeakMap","isConstructor":true},{"name":"WeakMap.prototype.set"},{"name":"WeakMap.prototype.get"},{"name":"WeakMap.prototype.delete"},{"name":"Array.prototype.flat"},{"name":"document.querySelectorAll"},{"name":"Event.prototype.composedPath"},{"name":"Element.prototype.closest"},{"name":"Element.prototype.querySelector"},{"name":"XMLHttpRequestUpload.prototype.addEventListener"},{"name":"Reflect.get"},{"name":"Reflect.set"},{"name":"XMLHttpRequest.prototype.setRequestHeader"},{"name":"Object.getOwnPropertyNames"},{"name":"Object.getOwnPropertyDescriptor"},{"name":"Element.prototype.matches"}]`;function We(){return Xe}var N;function je(){if(N)return N;let e=We();if(e.startsWith("<"))return[];try{return N=JSON.parse(e),N}catch{return[]}}function Ee(e=je()){let t=[];te()||t.push({code:-800,text:"Function.prototype.toString() is overridden \u2014 override check results may be inaccurate.",severity:"Warning"});for(let o of e){let n=Q(o.name);if(n==null)continue;let r=ee(n)??n?.toString?.();oe(r,o)||t.push({code:-1001,text:`"${o.name}" is overridden \u2014 may affect RUM agent behavior.`,severity:"Warning"})}return t}function ze(e){return Array.isArray(e)}function de(e=!1){if(window.dtPendingHealthCheck!==void 0)return window.dtPendingHealthCheck;let t=Ke(e);return window.dtPendingHealthCheck=t,t.finally(()=>{delete window.dtPendingHealthCheck})}async function Je(){let e=globalThis.dynatrace;console.log("%c Dynatrace RUM \u2014 Standalone HealthCheck %c Gen3 agent detected, delegating to agent based health check \u2713",T,""),await e.loadDebugTools();let t=await(e.debugtools?.runHealthCheck({returnDiagnosticData:!0})??[]),o=ze(t)?t:[],n=o.find(c=>c.text.startsWith(d)),r=n?n.text.slice(d.length):"unknown",i="1.347.4.20260902-154543";return console.log(`%c Standalone Healthcheck v${i} | Agent on page: v${r}${r!=="unknown"&&r!==i?" \u26A0 version mismatch":""} `,"background:#007a6e;color:#fff;font-size:11px;padding:4px 16px;border-radius:0 0 4px 4px"),console.log(`\u2139\uFE0F Agent based Healthcheck ran - To run standalone health check instead:
dtRunStandaloneHealthCheck(true)`),o}async function Ke(e){let t=typeof globalThis.dynatrace?.loadDebugTools=="function";if(!e&&t)return Je();let[o,n]=await Promise.all([j("","",{parseCookieString:h,serializeCookie:g,serializeCookieDeletion:A}),Z()]),r=[...J(),...z(),...o,...ae(),...n,...Ee(),{code:-1e3,text:"Standalone health check \u2014 snippet v1.347.4.20260902-154543",severity:"Info"}];return R(r,e),r}window.dtRunStandaloneHealthCheck=de;de();})();