В настоящее время это изображение, которое я имею при анализе трассы GCP.Это полезно, но нам нужно провести более глубокий анализ некоторых точек, которые мы хотим улучшить.
![Standard Trace without nested user function info](https://i.stack.imgur.com/dD5Wr.png)
То, что мы хотели бы сделать, - это иметь что-токак это
| 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. Но я не могу иметь никакого отличного поведения от этого.