Google GCP Trace: трассировка с информацией о вложенных пользовательских функциях - PullRequest
1 голос
/ 08 мая 2019

В настоящее время это изображение, которое я имею при анализе трассы GCP.Это полезно, но нам нужно провести более глубокий анализ некоторых точек, которые мы хотим улучшить.

Standard Trace without nested user function info

То, что мы хотели бы сделать, - это иметь что-токак это

  | vi/route/r   
     | function abc (75 ms)
       | redis-hget (1 ms)
       | datastore (69 ms)
          | function cde (30 ms)
              | ...

Мы много пробовали, но не нашли дополнительной документации, касающейся концепций трассировки GCP, а только подробные вызовы API.

Здесьнаш POC

начальный уровень

require('@google-cloud/trace-agent').start({
    projectId: 'my-project',
    keyFilename: './my-credentials.json',
    stackTraceLimit: 0,
});

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

const toSecondLevel = require('./controllers/home');
const initController = require('./controllers/init');

app.post('/poc/', bodyParser.json(), async (req, res) => {

    const trace = require('@google-cloud/trace-agent').get()

    const rootSpan = trace.getCurrentRootSpan();
    const { requestType } = req.body;

    rootSpan.addLabel('Root - First Level' , requestType);
    await toSecondLevel(rootSpan, req, res);

    rootSpan.endSpan(new Date());
    res.send('Hello World! ===> ' + requestType);
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

второй уровень

const toThirdLevel = require('../services/home')


const secondLevelFunction = async (rootSpan, req, res) => {

    await secondLevelFunctionPromise(rootSpan);
}


const secondLevelFunctionPromise = (rootSpan) => new Promise((resolve, reject) => {
    const span = rootSpan.createChildSpan({ name: 'secondLevelFunction' });
    setTimeout(async () => {
        console.log('secondLevelFunction', span.getTraceContext())
        span.addLabel('Should be nested to Root?', 'NOT nested');
        await toThirdLevel(rootSpan, new Date());

        span.endSpan(new Date())
        resolve();
    }, 2400);
})

module.exports = secondLevelFunction;

и третий уровень

const thirdLevelFunction = (rootSpan, parametro1) => new Promise((resolve, reject) => {
    const span = rootSpan.createChildSpan({ name: 'thirdLevelFunction' });
    setTimeout(() => {
        span.addLabel('thirdLevelFunction', 'not nested as well')
        console.log(span.getTraceContext())

        span.endSpan(new Date());
        resolve();
    }, 1392);
})

module.exports = thirdLevelFunction;

Проблемы / Концептуальные вопросы:

1- Нет Span Вложено в POC

2- Все промежутки имеют getTraceContext().Могу ли я использовать это для некоторых, как вкладывать мои Spans?

3- Можно ли сделать то, что я собираюсь сделать?(A-Вложить мой Span и B-Nest в одно и то же дерево, показанное на первом изображении?

4- Класс RootSpan расширяет Span. Но я не могу иметь никакого отличного поведения от этого.

1 Ответ

0 голосов
/ 20 мая 2019

Теперь это работает.Что необходимо (typescript для лучшего понимания):

import * as traceAgent from '@google-cloud/trace-agent';
const trace: traceAgent.PluginTypes.Tracer = traceAgent.get();
const span: TraceSpan = this.trace.createChildSpan(options);
...
span.addLabel('property',yourContent);
spam.endSpan(getDate());

Важно отметить, что traceAgent.get () является фабрикой, и плагину удается придать ей согласованность порядка событий, даже если несколько потоковпросят новые промежутки.

Я настоятельно рекомендую:

  1. использовать предоставленные интерфейсы, так как документация плохая.Чтение интерфейсов и реального кода даст вам лучшее понимание
  2. Создайте оболочку для своего диапазона, чтобы вы могли создать косвенную привязку, гораздо более привязанную к вашим потребностям.Теперь я могу открыть диапазон с меткой, закрыть с меткой, добавить объект, чтобы я мог создать метку на основе объекта.

Now Working: Actual code and RPC calls

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...