您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
onclick to view logs of a trace id
// ==UserScript== // @name datadog-traceId // @namespace http://tampermonkey.net/ // @version 0.1.8 // @description onclick to view logs of a trace id // @author greatbody // @include https://app.datadoghq.com/logs* // @grant unsafeWindow // @run-at document-end // ==/UserScript== // 2019年08月28日15:28:57 update author info, and use include // 2019年09月10日15:04:16 use Datetime at very top that every log has as a backup source of timestamp const baseURL = 'https://app.datadoghq.com'; function buildURL(baseURL, params) { const paramArr = []; Object.keys(params).forEach((key) => { paramArr.push(`${key}=${encodeURIComponent(params[key])}`); }); return `${baseURL}?${paramArr.join('&')}`; } function buildAttrbutes() { const rows = document.querySelectorAll('.log_raw-json tr'); const attrs = {}; for (let i = 0; i < rows.length; i += 1) { const row = rows[i]; const cells = row.innerText.split(/\s+/ig); if (cells.length === 2) { attrs[cells[0]] = { row: row, value: cells[1] }; } } return attrs; } function clearExistButton() { const btn = document.querySelector('#btnOpenTraceIdView'); if (btn) btn.remove(); } function findTraceId() { const attributes = buildAttrbutes(); const traceIdObj = attributes['traceId']; let timestampObj = attributes['@timestamp']; if (!timestampObj) { const dom = document.querySelector('.log_event-panel_status-date__date span.absolute'); timestampObj = { row: null, value: dom.innerHTML.replace('at', '') }; } if (!traceIdObj || !traceIdObj.row) { return; } const timestamp = timestampObj.value; const traceId = traceIdObj.value; const traceIdRow = traceIdObj.row; if (traceIdRow.lastTraceId != traceId) { clearExistButton(); const button = document.createElement('button'); const divBox = document.querySelector('.ui_layout_expandable-block__content'); const boxPreClass = divBox.childNodes[0]; button.innerHTML = 'Open Logs of traceId<div class="ui_form_button__icon-wrapper"><svg class="ui_icons_icon ui_icons_icon--md ui_icons_icon--is-scaled-down ui_form_button__icon--position-right"><title></title><use xlink:href="#ui_icons_export" fill=""></use></svg></div>'; button.id = 'btnOpenTraceIdView'; button.onclick = () => { const startMilliSec = new Date(timestamp).getTime() - 10 * 60 * 1000; const destMilliSec = new Date(timestamp).getTime() + 10 * 60 * 1000; const url = buildURL(`${baseURL}/logs`, { cols: 'core_host,core_service', from_ts: startMilliSec, index: 'main', live: 'false', messageDisplay: 'inline', query: `@traceId:${traceId}`, stream_sort: 'desc', to_ts: destMilliSec }); // eslint-disable-next-line no-undef unsafeWindow.open(url, '_blank'); }; button.className = 'ui_form_button ui_form_button--md ui_form_button--default log_export-dropdown ui_dialogs_popover167 ui_dialogs_popover__handle'; button.style.marginBottom = '5px'; button.style.backgroundColor = '#28a745'; button.style.color = 'white'; divBox.insertBefore(button, boxPreClass); traceIdRow.lastTraceId = traceId; } } (function () { 'use strict'; setInterval(() => { findTraceId(); }, 1000); })();