RUM JavaScript API - 1.345.1
    Preparing search index...

    Standalone RUM Health Check Snippet

    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 I="RUM JavaScript config (see details)",d="RUM JavaScript is running with version: ";var oe={Error:"\u274C",Warning:"\u26A0\uFE0F",Info:"\u2139\uFE0F",Verbose:"\xB7"},ne={Error:"action may be required",Warning:"review recommended",Info:"no action needed",Verbose:"verbose details"},re={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 N(e,t){ce(t),ie(e)}function ie(e){let t=ae(e.filter(se));p(t,"Error",!1),p(t,"Warning",!1),p(t,"Info",!0),p(t,"Verbose",!0),le(e)}function se(e){return e.text!==I&&!e.text.includes(d)}var h="background:#00b4a0;color:#fff;font-size:14px;font-weight:bold;padding:6px 16px;border-radius:4px 4px 0 0";function ce(e){console.log(`



    %c Dynatrace RUM \u2014 Standalone Environment Check `,h),console.log("%c Snippet v1.345.1.20260724-043829"+(e?"":" | No agent detected"),"background:#007a6e;color:#fff;font-size:11px;padding:4px 16px;border-radius:0 0 4px 4px")}function ae(e){let t={Error:[],Warning:[],Info:[],Verbose:[]};for(let o of e)t[o.severity].push(o);return t}function p(e,t,o){let n=e[t];if(n.length===0)return;let r=`%c${t} (${n.length})%c \u2014 ${ne[t]}`,i=re[t];o?console.groupCollapsed(r,i,""):console.group(r,i,"");let s=oe[t];for(let c of n)de(c,s);console.groupEnd()}function de(e,t){e.link?(console.groupCollapsed(` ${t} ${e.text}`),console.log(e.link),console.groupEnd()):console.log(` ${t} ${e.text}`)}function le(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 y(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 T(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 k(e){return T(e,"",0)}var O="dtSN_",v="dtUSR_",R="dtOFF_",A="dtCM_",w="dtCFG_",D="dtTAB_",P="dtTabUnload";function F(e){return e+""}var l=typeof globalThis<"u"?globalThis:typeof window<"u"?window:void 0;var Ze=l.navigator;var u="dT_",M="DT_RUM",H="dynatrace",L="dtrum";var ue="dtSa",fe="dtSR",$=-1,x=$;function pe(){if(x!==$)return x;let e=l[u]?.scv?.("postfix")||l[u]?.gCP?.();return e&&(x=e),e}function a(e){let t;return function(){if(t)return t;let n=pe();return n?(t=`${e}${n}`,t):e}}var C="dTValidationCookie",tt=a("dtPC"),ot=a("dtCookie"),nt=a("rxvt"),rt=a("rxVisitor"),it=a(C),st=a(ue),ct=a(fe);var m="dtHCTestVal42",b=500,ge=36,me=2,Ee=8,g=[O,v,R,A,C,w,D,P],G=["dtCookie","dtPC","dtSa","rxVisitor","rxvt","dtSR","dtsrVID","dtDisabled","__dtCookie"];function _e(e){let t="";for(;t.length<e;)t+=Math.random().toString(ge).slice(me);return t.slice(0,e)}function f(e,t){return e.endsWith("_")?`${e}${t}`:`${e}_${t}`}function Se(e){return new Promise(t=>{setTimeout(t,e)})}var he={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 "${m}", got "${t}"). Possible causes: cookie encoding issues, browser extensions, or content security policies.`},Te={missing:e=>`Cookie "${e}" was set but not retained after ${b}ms. Possible causes: cookies cleared by a script, browser extension, or name-pattern-based cookie blocking.`,modified:(e,t)=>`Cookie "${e}" was retained after ${b}ms but its value was modified (expected "${m}", got "${t}"). Possible causes: cookie tampering, encoding issues, or browser extensions.`};function U(e,t,o){let n=[],r=o.parseCookieString(document.cookie);for(let i of e){let s=r.get(i)?.value;s===void 0?n.push({text:t.missing(i),severity:"Error"}):s!==m&&n.push({text:t.modified(i,s),severity:"Error"})}return n}function xe(e,t,o){return[...[...g,...G].flatMap(r=>[f(r,"hc"),f(r,o)]),...g.map(r=>f(f(r,`${e}_${t}`),"hc"))]}function Ce(e,t,o){let n=[...g,...G,...g.map(r=>f(r,`${e}_${t}`))];try{let r=o.parseCookieString(document.cookie);return n.filter(i=>!r.has(i))}catch{return n}}async function V(e,t,o){let n=xe(e,t,_e(Ee)),r=Ce(e,t,o),i=[...n,...r],s=[];try{i.forEach(S=>{document.cookie=o.serializeCookie(S,m)});let c=U(i,he,o);s.push(...c),r.forEach(S=>{try{document.cookie=o.serializeCookieDeletion(S)}catch{}}),c.length===0&&(await Se(b),s.push(...U(n,Te,o)))}catch(c){s.push({text:`Cookie access threw an error (${c instanceof Error?c.message:F(c)}). This may occur in sandboxed iframes or restricted browser contexts.`,severity:"Error"})}finally{try{i.forEach(c=>{document.cookie=o.serializeCookieDeletion(c)})}catch{}}return s}function be(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement||e instanceof HTMLButtonElement}function Ie(){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 Ne(e,t){let o=e[t];if(!be(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 ye(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=Ie(),o=[];for(let n of t)try{Ne(e,n)&&o.push(n)}catch{}return o.sort()}function Oe(e,t){let o=ke(e);return o.length===0?null:{formIdentifier:ye(e,t),overriddenProperties:o}}function ve(e){let t=e.overriddenProperties.join(", ");return{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 K(){let e=[];return document.querySelectorAll("form").forEach((o,n)=>{if(!(o instanceof HTMLFormElement))return;let r=Oe(o,n);r&&e.push(ve(r))}),e}var E="__zone_symbol__OriginalDelegate";function j(){let e=globalThis.MutationObserver;if(Ae(e))return E in e?[{severity:"Warning",text:`MutationObserver has been overridden by zone.js (detected via ${E}).`}]:[];let t=Re(e);return t?[{severity:"Warning",text:`MutationObserver has been overridden by zone.js (detected via ${t.property}).`}]:[{severity:"Warning",text:"MutationObserver has been overridden by a non-native, non-zone.js implementation."}]}function Re(e){let t=window.Zone?.__symbol__?.("MutationObserver");if(!t)return;let o=window[t];if(!o)return;if(o[E])return{property:`Zone.__symbol__("MutationObserver").${E}`};if(o!==e)return{property:'Zone.__symbol__("MutationObserver")'}}function Ae(e){return typeof e=="function"&&/{\s+\[native code]/.test(Function.prototype.toString.call(e))}function W(e){let t=function(...o){return t=we,e.apply(this,o)};return function(...o){return t.apply(this,o)}}function we(...e){}var De=30,z="DYNATRACE_RUM_SNIPPET_REJECTION_TEST";async function Y(){let e=[],t=Pe(),o=!1;try{await Promise.reject(z)}catch{o=!0}return o||e.push({text:"Rejected Promise not caught! This can cause all sort of problems!",severity:"Error"}),e.push(...await t),e}function Pe(){return new Promise(function(e){let t=window.console.error;window.console.error=i;let o=()=>{window.console.error=t},n=setTimeout(function(){r([])},De),r=W(function(s){e(s),o(),clearTimeout(n)});function i(s){typeof s!="string"||s!==z||(t.call(this,s),r([{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 X=/function (.*)\(\) {[\t\n\r ]+\[native code][\t\n\r ]+}/;function B(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 J(e){try{return Function.prototype.toString.call(e)}catch{return}}function Z(){return X.test(Function.prototype.toString.toString())}function q(e,t){let o=X.exec(e);if(!o)return!1;let n=Fe(t.name.split("."));return!o[1]||o[1]===n}function Fe(e){return e[e.length-1]}var Me=[H,u,L,M];function Q(){return Me.filter(t=>document.getElementById(t)!==null).map(t=>({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 He=`[{"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":"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":"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":"Array.prototype.some"},{"name":"String.prototype.split"},{"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":"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":"String.prototype.toLowerCase"},{"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 Le(){return He}var _;function $e(){if(_)return _;let e=Le();if(e.startsWith("<"))return[];try{return _=JSON.parse(e),_}catch{return[]}}function ee(e=$e()){let t=[];Z()||t.push({text:"Function.prototype.toString() is overridden \u2014 override check results may be inaccurate.",severity:"Warning"});for(let o of e){let n=B(o.name);if(n==null)continue;let r=J(n)??n?.toString?.();q(r,o)||t.push({text:`"${o.name}" is overridden \u2014 may affect RUM agent behavior.`,severity:"Warning"})}return t}function Ue(e){return Array.isArray(e)}function te(e=!1){if(window.dtPendingHealthCheck!==void 0)return window.dtPendingHealthCheck;let t=Ve(e);return window.dtPendingHealthCheck=t,t.finally(()=>{delete window.dtPendingHealthCheck})}async function Ge(){let e=globalThis.dynatrace;console.log("%c Dynatrace RUM \u2014 Standalone HealthCheck %c Gen3 agent detected, delegating to agent based health check \u2713",h,""),await e.loadDebugTools();let t=await(e.debugtools?.runHealthCheck({returnDiagnosticData:!0})??[]),o=Ue(t)?t:[],n=o.find(c=>c.text.startsWith(d)),r=n?n.text.slice(d.length):"unknown",i="1.345.1.20260724-043829";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 Ve(e){let t=typeof globalThis.dynatrace?.loadDebugTools=="function";if(!e&&t)return Ge();let[o,n]=await Promise.all([V("","",{parseCookieString:y,serializeCookie:T,serializeCookieDeletion:k}),Y()]),r=[...j(),...K(),...o,...Q(),...n,...ee(),{text:"Standalone health check \u2014 snippet v1.345.1.20260724-043829",severity:"Info"}];return N(r,e),r}window.dtRunStandaloneHealthCheck=te;te();})();