Datadog RUM log highlighting

Optional userscript that adds highting to relevant RUM entries specified by https://greasyfork.org/en/scripts/475250-sentry-to-datadog-rum-and-log-buttons

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name     Datadog RUM log highlighting
// @description Optional userscript that adds highting to relevant RUM entries specified by https://greasyfork.org/en/scripts/475250-sentry-to-datadog-rum-and-log-buttons
// @version  1
// @grant    none
// @match    https://app.datadoghq.com/rum/sessions*
// @namespace happyviking
// @license   MIT
// ==/UserScript==

//https://stackoverflow.com/questions/5525071/how-to-wait-until-an-element-exists
function waitForElm(selector) {
    return new Promise(resolve => {
        if (document.querySelector(selector)) {
            return resolve(document.querySelector(selector));
        }

        const observer = new MutationObserver(mutations => {
            if (document.querySelector(selector)) {
                observer.disconnect();
                resolve(document.querySelector(selector));
            }
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    });
}

const main = async () => {

    await waitForElm('.dt-event_date') //Just waiting till it loads

    const url = new URL(window.location)
    const params = url.searchParams

    const from = params.get("highlight_from")
    const to = params.get("highlight_to")

    if (!from || !to) return

    document.querySelectorAll('tbody.log-dt-event').forEach(tbody => {
        let timestampText = tbody.querySelector(".dt-event_date").textContent //Example: Sep 13 15:39:44.766
        timestampText = timestampText.split(".")[0]
        timestampText += ` ${(new Date()).getFullYear()} UTC`
        const millis = (new Date(Date.parse(timestampText))).getTime()

        if (millis > from && millis < to) tbody.style.backgroundColor = "#FFE993"

    })
}

//There are probably cleaner ways to do this but I don't really care, this works and this
//is supposed to be fast
let currentPage = location.href;
main()
setInterval(() =>
{
    if (currentPage != location.href){
        currentPage = location.href;
        main()
    }
}, 500);