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 s=[{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.getEntriesByType"},{name:"document.addEventListener"},{name:"window.addEventListener"},{name:"document.removeEventListener"},{name:"window.removeEventListener"},{name:"Object.assign"},{name:"RegExp.prototype.test"},{name:"Set",isConstructor:!0},{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.now"},{name:"Headers",isConstructor:!0},{name:"Headers.prototype.get"},{name:"Headers.prototype.set"},{name:"Array.prototype.map"},{name:"Function.prototype.bind"},{name:"Promise.resolve"},{name:"String.prototype.split"},{name:"Map",isConstructor:!0},{name:"Map.prototype.get"},{name:"Map.prototype.set"},{name:"String.prototype.charAt"},{name:"Error",isConstructor:!0},{name:"String.prototype.substring"},{name:"navigation.addEventListener"},{name:"navigation.removeEventListener"},{name:"URL",isConstructor:!0},{name:"document.getElementById"},{name:"Math.floor"},{name:"Array.prototype.unshift"},{name:"Math.min"},{name:"AbortController.prototype.abort"},{name:"Promise",isConstructor:!0},{name:"AbortSignal.timeout"},{name:"AbortController",isConstructor:!0},{name:"setTimeout"},{name:"DOMException",isConstructor:!0},{name:"String.prototype.toUpperCase"},{name:"XMLHttpRequest.prototype.getAllResponseHeaders"},{name:"Map.prototype.forEach"},{name:"Map.prototype.clear"},{name:"String.prototype.replace"},{name:"Map.prototype.has"},{name:"Array.prototype.filter"},{name:"Promise.all"},{name:"Math.max"},{name:"WeakSet",isConstructor:!0},{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:!0},{name:"PerformanceObserverEntryList.prototype.getEntries"},{name:"PerformanceObserver.prototype.observe"},{name:"PerformanceObserver.prototype.disconnect"},{name:"String.prototype.indexOf"},{name:"Headers.prototype.append"},{name:"Object.entries"},{name:"Array.prototype.join"},{name:"Object.fromEntries"},{name:"String.prototype.startsWith"},{name:"Array.prototype.some"},{name:"JSON.stringify"},{name:"Array.prototype.shift"},{name:"Object.freeze"},{name:"Array.isArray"},{name:"JSON.parse"},{name:"visualViewport.addEventListener"},{name:"visualViewport.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:!1},{name:"Reflect.construct"},{name:"Function.prototype.toString"},{name:"Function.toString"},{name:"Array.prototype.concat"},{name:"Symbol.for"},{name:"Proxy",isConstructor:!0},{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:!0},{name:"TextEncoder.prototype.encode"},{name:"Uint8Array",isConstructor:!0},{name:"ArrayBuffer.prototype.slice"},{name:"Blob",isConstructor:!0},{name:"navigator.sendBeacon"},{name:"encodeURIComponent"},{name:"Response.prototype.json"},{name:"SyntaxError",isConstructor:!0},{name:"String.prototype.toLowerCase"},{name:"Element.prototype.getAttribute"},{name:"String.prototype.trim"},{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.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:!0},{name:"document.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.getRandomValues"},{name:"RegExp",isConstructor:!0},{name:"Object.prototype.hasOwnProperty"},{name:"Array.prototype.findLast"},{name:"ReportingObserver.prototype.observe"},{name:"ReportingObserver.prototype.disconnect"},{name:"Number.prototype.toFixed"},{name:"performance.getEntriesByName"},{name:"document.querySelector"},{name:"Window.prototype.addEventListener"},{name:"Window.prototype.removeEventListener"},{name:"MutationObserver.prototype.observe"},{name:"MutationObserver.prototype.disconnect"},{name:"Element.prototype.hasAttribute"},{name:"WeakMap",isConstructor:!0},{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"}];var R="RUM JavaScript config (see details)",_="RUM JavaScript is running with version: ";var ue="https://dt-url.net/af03atz",Se={Error:"\u274C",Warning:"\u26A0\uFE0F",Info:"\u2139\uFE0F",Verbose:"\u{1F50E}"},pe={Error:"action may be required",Warning:"review recommended",Info:"no action needed",Verbose:"verbose details"},fe={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 h(e,t){Te(t),Ne(e)}function Ne(e){let t=ge(e.filter(Ie));S(t,"Error",!1),S(t,"Warning",!1),S(t,"Info",!0),S(t,"Verbose",!0),Ce(e)}function Ie(e){return e.text!==R&&!e.text.includes(_)}var g="background:#00b4a0;color:#fff;font-size:14px;font-weight:bold;padding:6px 16px;border-radius:4px 4px 0 0";function Te(e){console.log(`
%c Dynatrace RUM \u2014 Standalone Environment Check `,g),console.log("%c Snippet v1.349.1.20260918-043908"+(e?"":" | No agent detected"),"background:#007a6e;color:#fff;font-size:11px;padding:4px 16px;border-radius:0 0 4px 4px")}function ge(e){let t={Error:[],Warning:[],Info:[],Verbose:[]};for(let o of e)t[o.severity].push(o);return t}function S(e,t,o){let n=e[t];if(n.length===0)return;let r=`%c${t} (${n.length})%c \u2014 ${pe[t]}`,i=fe[t];o?console.groupCollapsed(r,i,""):console.group(r,i,"");let c=Se[t];for(let a of n)me(a,c);console.groupEnd()}function me(e,t){let o=`${ue}#${e.code}`;console.groupCollapsed(` ${t} ${e.text}`),console.log(o),console.groupEnd()}function Ce(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 x(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 m(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 m(e,"",0)}var O="dtCookie",b="dtPC",y="rxvt",P="rxVisitor",M="dtSa",v="dtSR",D="dTValidationCookie";var k="__dtCookie",G="dtDisabled",w="dtsrVID";var L="dtSN_",F="dtUSR_",H="dtOFF_",U="dtCM_",$="dtCFG_";var V="dtTAB_",B="dtTabUnload";function X(e){return e+""}var f="dtHCTestVal42",C=500,Re=36,he=2,xe=8,E={CROSS_DOMAIN_SESSION:k,DISABLED:G,PAGE_CONTEXT:b,SESSION:O,SOURCE_ACTION:M,SR:v,SR_VID:w,VISIT_TIMEOUT:y,VISITOR:P},p=[L,F,H,U,D,$,V,B],W=[E.SESSION,E.PAGE_CONTEXT,E.SOURCE_ACTION,E.VISITOR,E.VISIT_TIMEOUT,E.SR,E.SR_VID,E.DISABLED,E.CROSS_DOMAIN_SESSION];function Ae(e){let t="";for(;t.length<e;)t+=Math.random().toString(Re).slice(he);return t.slice(0,e)}function l(e,t){return e.endsWith("_")?`${e}${t}`:`${e}_${t}`}function Oe(e){return new Promise(t=>{setTimeout(t,e)})}var be={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 "${f}", got "${t}"). Possible causes: cookie encoding issues, browser extensions, or content security policies.`},ye={missingCode:-202,modifiedCode:-203,missing:e=>`Cookie "${e}" was set but not retained after ${C}ms. Possible causes: cookies cleared by a script, browser extension, or name-pattern-based cookie blocking.`,modified:(e,t)=>`Cookie "${e}" was retained after ${C}ms but its value was modified (expected "${f}", got "${t}"). Possible causes: cookie tampering, encoding issues, or browser extensions.`};function j(e,t,o,n){let r=[],i=o.parseCookieString(document.cookie);for(let c of e){let a=i.get(c)?.value;a===void 0?r.push({code:t.missingCode,text:t.missing(c),severity:n}):a!==f&&r.push({code:t.modifiedCode,text:t.modified(c,a),severity:n})}return r}function Pe(e,t,o){return[...[...p,...W].flatMap(r=>[l(r,"hc"),l(r,o)]),...p.map(r=>l(l(r,`${e}_${t}`),"hc"))]}function Me(e,t,o){let n=[...p,...W,...p.map(r=>l(r,`${e}_${t}`))];try{let r=o.parseCookieString(document.cookie);return n.filter(i=>!r.has(i))}catch{return n}}async function z(e,t,o,n){let r="Info";n===void 0?r="Warning":n==="cookies"&&(r="Error");let i=Pe(e,t,Ae(xe)),c=Me(e,t,o),a=[...i,...c],u=[];try{a.forEach(T=>{document.cookie=o.serializeCookie(T,f)});let d=j(a,be,o,r);u.push(...d),c.forEach(T=>{try{document.cookie=o.serializeCookieDeletion(T)}catch{}}),d.length===0&&(await Oe(C),u.push(...j(i,ye,o,r)))}catch(d){u.push({code:-204,text:`Cookie access threw an error (${d instanceof Error?d.message:X(d)}). This may occur in sandboxed iframes or restricted browser contexts.`,severity:"Error"})}finally{try{a.forEach(d=>{document.cookie=o.serializeCookieDeletion(d)})}catch{}}return u}function ve(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 ke(e,t){let o=e[t];if(!ve(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 Ge(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 we(e){let t=De(),o=[];for(let n of t)try{ke(e,n)&&o.push(n)}catch{}return o.sort()}function Le(e,t){let o=we(e);return o.length===0?null:{formIdentifier:Ge(e,t),overriddenProperties:o}}function Fe(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 J(){let e=[];return document.querySelectorAll("form").forEach((o,n)=>{if(!(o instanceof HTMLFormElement))return;let r=Le(o,n);r&&e.push(Fe(r))}),e}var N="__zone_symbol__OriginalDelegate";function K(){let e=globalThis.MutationObserver;if(Ue(e))return N in e?[{code:-701,severity:"Warning",text:`MutationObserver has been overridden by zone.js (detected via ${N}).`}]:[];let t=He(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 He(e){let t=window.Zone?.__symbol__?.("MutationObserver");if(!t)return;let o=window[t];if(!o)return;if(o[N])return{property:`Zone.__symbol__("MutationObserver").${N}`};if(o!==e)return{property:'Zone.__symbol__("MutationObserver")'}}function Ue(e){return typeof e=="function"&&/{\s+\[native code]/.test(Function.prototype.toString.call(e))}function Y(e){let t=function(...o){return t=$e,e.apply(this,o)};return function(...o){return t.apply(this,o)}}function $e(...e){}var Ve=30,Z="DYNATRACE_RUM_SNIPPET_REJECTION_TEST";async function q(){let e=[],t=Be(),o=!1;try{await Promise.reject(Z)}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 Be(){return new Promise(function(e){let t=window.console.error;window.console.error=i;let o=()=>{window.console.error=t},n=setTimeout(function(){r([])},Ve),r=Y(function(c){e(c),o(),clearTimeout(n)});function i(c){typeof c!="string"||c!==Z||(t.call(this,c),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 ee(e){let t=window;for(let o of e.split(".")){if(t===null||typeof t!="object"&&typeof t!="function")return;try{t=t[o]}catch{return}}return t}function te(e){try{return Function.prototype.toString.call(e)}catch{return}}function oe(){return Q.test(Function.prototype.toString.toString())}function ne(e,t){let o=Q.exec(e);if(!o)return!1;let n=Xe(t.name.split("."));return!o[1]||o[1]===n}function Xe(e){return e[e.length-1]}var re=typeof globalThis<"u"?globalThis:typeof window<"u"?window:void 0;var At=re.navigator;var ie="dT_",se="DT_RUM",ce="dynatrace",ae="dtrum";var je=[ce,ie,ae,se];function Ee(){return je.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 I;function We(){if(I)return I;try{return I=s,I}catch{return[]}}function de(e=We()){let t=[];oe()||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=ee(o.name);if(n==null)continue;let r=te(n)??n?.toString?.();ne(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 _e(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",g,""),await e.loadDebugTools();let t=await(e.debugtools?.runHealthCheck({returnDiagnosticData:!0})??[]),o=ze(t)?t:[],n=o.find(a=>a.text.startsWith(_)),r=n?n.text.slice(_.length):"unknown",i="1.349.1.20260918-043908";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([z("","",{parseCookieString:x,serializeCookie:m,serializeCookieDeletion:A}),q()]),r=[...K(),...J(),...o,...Ee(),...n,...de(),{code:-1e3,text:"Standalone health check \u2014 snippet v1.349.1.20260918-043908",severity:"Info"}];return h(r,e),r}window.dtRunStandaloneHealthCheck=_e;_e();})();