节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
1.70 KiB
Stardust
/**
 * 自动埋点内部标记与路径排除。
 *
 * 用于识别 SDK 自身请求(不产生 Span、不注入 traceparent),
 * 以及统一 /App/、/Trace/ 监控接口的排除判断。
 */

'use strict';

const INTERNAL = typeof Symbol === 'function' ? Symbol.for('stardust.internal') : '__stardustInternal';

/**
 * 标记请求参数为 SDK 内部请求。
 * @param {Object} options 请求参数
 * @returns {Object} 原对象
 */
function markInternal(options) {
    if (options && typeof options === 'object') {
        try {
            options[INTERNAL] = true;
        } catch (err) {
            // 冻结对象无法标记时忽略
        }
    }
    return options;
}

/**
 * 判断是否为 SDK 内部请求。
 * @param {Object} options 请求参数
 * @returns {Boolean} 是否内部请求
 */
function isMarkedInternal(options) {
    return !!(options && typeof options === 'object' && options[INTERNAL]);
}

/**
 * 判断路径是否为星尘监控接口。
 * @param {String} path 路径或 URL
 * @returns {Boolean} 是否忽略
 */
function isInternalPath(path) {
    const text = String(path || '');
    if (!text) return false;
    return /^\/(App|Trace)(\/|$)/i.test(text) || /\/App(\/|$|\?)/i.test(text) || /\/Trace(\/|$|\?)/i.test(text);
}

/**
 * 判断 URL 是否为星尘监控接口。
 * @param {String} url URL
 * @returns {Boolean} 是否忽略
 */
function isInternalUrl(url) {
    const text = String(url || '');
    if (!text) return false;
    try {
        return isInternalPath(new URL(text, 'http://localhost').pathname);
    } catch (err) {
        return isInternalPath(text);
    }
}

module.exports = {
    markInternal,
    isMarkedInternal,
    isInternalPath,
    isInternalUrl,
};