Как настроить Azure AppInsights со всеми маршрутами для регистрации исключений и операторов консоли?
Это appInsights.js:
const appInsights = require('applicationinsights');
appInsights.setup(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING)
.setAutoCollectConsole(true, true)
.setAutoCollectExceptions(true)
.start();
module.exports = appInsights
маршруты/index.js:
var express = require('express');
var router = express.Router();
const { appInsights } = require('../services/appInsights');
const { botService } = require('../services/bot');
router.get('/', function (req, res, next) {
res.render('index', { title: 'Express' });
});
router.post('/api/messages', async function (req, res, next) {
console.info("--inside /messages--")
try {
//call a method from bot.js
});
}
catch (error) {
console.error('Error in /messages:', error);
appInsights.defaultClient.trackException({ exception: error });
res.status(500).send('Internal Server Error');
}
В настоящее время все регистрируется как «трассировка» в App Insights, и исключения не отображаются отдельно, хотя я использовал
appInsights.defaultClient.trackException({ exception: error });
в index.js, и я также не знаю, как использовать это в bot.js. Я снова попытался импортировать appInsights в Bot.js, но это привело к дублированию журналов. Я знаком с AWS, где я просто создаю лямбду, и по умолчанию у него есть журналы Cloudwatch, и я впервые работаю в Azure.
@Harshitha, в консоли AppInsights есть разные разделы: Трассировка, Зависимость, Запрос, Исключения. Прямо сейчас все записывается в Trace. Ошибки из console.error регистрируются. Никакой другой информации и предупреждений я не вижу. Насколько я понимаю, если бы я использовал trackExceptions
, исключения регистрировались бы отдельно, что облегчало бы отладку.
Итак, вы хотите одновременно регистрировать трассировки для всех уровней серьезности, включая ошибки?
Да, и для всех маршрутов. Последнее, я думаю, должно быть сделано с использованием AppInsights в качестве промежуточного программного обеспечения, но я не уверен, как это сделать. Как я уже сказал, повторный импорт AppInsights напрямую в Bot.js дублирует уже имеющиеся у меня журналы.
Что вы подразумеваете под дублированием журналов?
Я снова импортировал appInsights из appInsights.js в bot.js, чтобы проверить исключение при вызове функции Azure, но исключения по-прежнему не регистрируются отдельно, а журналы всего процесса печатаются дважды. Я не уверен, инициализируется ли appInsights снова. stackoverflow.com/questions/67197260/… Это может дать вам некоторый контекст того, что я пытаюсь сделать, и я надеюсь на лучшее/детальное решение, потому что я до сих пор не понимаю, как вызывать исключения из других файлы.
У вас была возможность изучить это MSDoc
@Мэтью Холлидей ты ищешь это
@СирраСнеха да.
@SirraSneha (по какой-то причине я не могу редактировать последний комментарий) Да, именно это. Я также хотел бы, чтобы исключения были реализованы для всех маршрутов/файлов. Я пытаюсь сделать это, используя appinsights в качестве промежуточного программного обеспечения. Мне просто хотелось бы получить несколько советов/примеров того, как это сделать, поскольку я раньше не работал над Express и Azure.
Я могу видеть журналы исключений и трассировок отдельно.
Исключения, обрабатываемые в блоке catch, отображаются в разделе исключений.
Я добавил этот код блока try catch в файл index.js.
try {
await someMethod();
res.status(200).send('Message processed successfully');
} catch (error) {
console.error('Error in /messages:', error);
appInsights.defaultClient.trackException({ exception: error });
res.status(500).send('Internal Server Error');
}
Мой файл index.js:
const express = require('express');
const router = express.Router();
const appInsights = require('../services/appInsights');
const { someMethod } = require('../services/bot');
router.get('/', function (req, res, next) {
res.send('API running at: /api/names, /api/error, /api/dependency');
});
router.get('/api/names', (req, res, next) => {
res.json(['Tony', 'Lisa', 'Michael', 'Ginger', 'Food']);
});
router.get('/api/error', (req, res, next) => {
try {
throw new Error('This is a test error');
} catch (error) {
appInsights.defaultClient.trackException({ exception: error });
res.status(500).json({ error: 'Internal Server Error' });
}
});
router.post('/api/messages', async function (req, res, next) {
console.info("--inside /messages--");
try {
await someMethod();
res.status(200).send('Message processed successfully');
} catch (error) {
console.error('Error in /messages:', error);
appInsights.defaultClient.trackException({ exception: error });
res.status(500).send('Internal Server Error');
}
});
module.exports = router;
Мой файл bot.js:
const appInsights = require('../services/appInsights');
async function someMethod() {
try {
console.info("Simulated successful process in bot service");
return "Success";
} catch (error) {
console.error('Error in bot service:', error);
appInsights.defaultClient.trackException({ exception: error });
throw error;
}
}
module.exports = {
someMethod
};
Я добавил еще несколько методов в appInsights.js.
Мой файл appInsights.js
const appInsights = require('applicationinsights');
appInsights.setup("
process.env.APPLICATIONINSIGHTS_CONNECTION_STRING")
.setAutoDependencyCorrelation(true)
.setAutoCollectRequests(true)
.setAutoCollectPerformance(true, true)
.setAutoCollectExceptions(true)
.setAutoCollectDependencies(true)
.setAutoCollectConsole(true, true)
.setUseDiskRetryCaching(true)
.setSendLiveMetrics(false)
.setDistributedTracingMode(appInsights.DistributedTracingModes.AI_AND_W3C)
.start();
module.exports = appInsights;
Мой файл app.js:
const express = require('express');
const app = express();
const indexRouter = require('./routes/index');
const appInsights = require('./services/appInsights');
app.use(express.json());
app.use((req, res, next) => {
appInsights.defaultClient.trackRequest({ name: req.method + ' ' + req.url, url: req.url, time: new Date(), duration: 0, resultCode: res.statusCode, success: true });
next();
});
app.use('/', indexRouter);
app.use((err, req, res, next) => {
console.error('Unhandled error:', err);
appInsights.defaultClient.trackException({ exception: err });
res.status(500).send('Internal Server Error');
});
const port = process.env.PORT || 3000;
app.set('port', port);
app.listen(port, () => {
console.info(`Server is running on port ${port}`);
});
Теперь для каждого маршрута у меня есть трассировки журнала App Insights.
В настоящее время вы можете регистрировать другие следы (информация, предупреждения и т. д.)?