Использование Azure AppInsights в приложении Nodejs Express Azure WebApp

Как настроить 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 22.05.2024 08:24

@Harshitha, в консоли AppInsights есть разные разделы: Трассировка, Зависимость, Запрос, Исключения. Прямо сейчас все записывается в Trace. Ошибки из console.error регистрируются. Никакой другой информации и предупреждений я не вижу. Насколько я понимаю, если бы я использовал trackExceptions, исключения регистрировались бы отдельно, что облегчало бы отладку.

Matthew Holliday 22.05.2024 08:35

Итак, вы хотите одновременно регистрировать трассировки для всех уровней серьезности, включая ошибки?

Harshitha 22.05.2024 09:20

Да, и для всех маршрутов. Последнее, я думаю, должно быть сделано с использованием AppInsights в качестве промежуточного программного обеспечения, но я не уверен, как это сделать. Как я уже сказал, повторный импорт AppInsights напрямую в Bot.js дублирует уже имеющиеся у меня журналы.

Matthew Holliday 22.05.2024 09:28

Что вы подразумеваете под дублированием журналов?

Harshitha 22.05.2024 11:12

Я снова импортировал appInsights из appInsights.js в bot.js, чтобы проверить исключение при вызове функции Azure, но исключения по-прежнему не регистрируются отдельно, а журналы всего процесса печатаются дважды. Я не уверен, инициализируется ли appInsights снова. stackoverflow.com/questions/67197260/… Это может дать вам некоторый контекст того, что я пытаюсь сделать, и я надеюсь на лучшее/детальное решение, потому что я до сих пор не понимаю, как вызывать исключения из других файлы.

Matthew Holliday 22.05.2024 12:03

У вас была возможность изучить это MSDoc

Harshitha 22.05.2024 12:23

@Мэтью Холлидей ты ищешь это

Sirra Sneha 23.05.2024 14:13

@СирраСнеха да.

Matthew Holliday 24.05.2024 07:21

@SirraSneha (по какой-то причине я не могу редактировать последний комментарий) Да, именно это. Я также хотел бы, чтобы исключения были реализованы для всех маршрутов/файлов. Я пытаюсь сделать это, используя appinsights в качестве промежуточного программного обеспечения. Мне просто хотелось бы получить несколько советов/примеров того, как это сделать, поскольку я раньше не работал над Express и Azure.

Matthew Holliday 24.05.2024 07:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу видеть журналы исключений и трассировок отдельно.

Исключения, обрабатываемые в блоке 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.

Другие вопросы по теме