google Cloud Trace 在 Express 中不起作用

google cloud trace not working in express

我正在尝试在我的 MERN 项目中实施 google 跟踪,该项目托管在 google 云平台中。

我已经按照 Google 提供的指南和示例进行操作,但我无法以任何方式使其工作。

import gCloudTrace from '@google-cloud/trace-agent';
// initialize gcloud trace
if (process.env.NODE_ENV === 'production') {
  console.log(`Starting google cloud trace...`);
  const tracer = gCloudTrace.start();
  console.log(JSON.stringify(tracer,null,2));
};

import express from 'express';
import apiRoute  from './api.js';
import indexRoute from './index/indexRoute.js';

try {

  // setup
  const host = process.env.HOST || '0.0.0.0';
  const port = process.env.PORT || 5050;
  const app = express();

  // routes
  app.use('/', indexRoute);
  app.use('/api', checkGloblalSettings, apiRoute);

  // create and run HTTP server
  app.listen(port, host, () => {
    console.log(`EXPRESS SERVER HTTP BACKEND UP AND RUNNING ON ${host} : ${port}`);
  });

  } catch(error) {
    globalErrorHandler(error);
};

当我部署(google app engine,flex env)时一切正常,所有路由都正常但我在我的项目中找不到任何踪迹。 我仔细检查了 gcloud 设置:Trace API 已启用,无需创建自定义凭据。

有什么建议吗?

我终于解决了这个问题。 虽然问题中的代码似乎是正确的,但问题本质上在于 NodeJS 如何处理 ES6 import() 而不是 require()。

在整个 Google 跟踪文档中,您只会找到带有 require() 的示例。 举个例子:

if (process.env.NODE_ENV === 'production') {
  require('@google-cloud/trace-agent').start();
}

const express = require('express');
const got = require('got');

const app = express();
const DISCOVERY_URL = 'https://www.googleapis.com/discovery/v1/apis';

// This incoming HTTP request should be captured by Trace
app.get('/', async (req, res) => {
  // This outgoing HTTP request should be captured by Trace
  try {
    const {body} = await got(DISCOVERY_URL, {responseType: 'json'});
    const names = body.items.map(item => item.name);
    res.status(200).send(names.join('\n')).end();
  } catch (err) {
    console.error(err);
    res.status(500).end();
  }
});

// Start the server
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

事实是,在使用 require 时会遵守导入顺序(因此,如果您放置 require('@ google-cloud/trace-agent').start(); 首先一切正常),使用 import()代码也在导入 express 模块后运行,因此不会跟踪任何内容。

为了解决问题,我重新创建了 require 语法 (here the documentation),然后使用 require() 一切正常:

import { createRequire } from 'module';
const require = createRequire(import.meta.url);
if (process.env.NODE_ENV === 'production') {
  // [START trace_setup_nodejs_implicit]
  require('@google-cloud/trace-agent').start({
    logLevel: 2,
    flushDelaySeconds: 30,
    ignoreUrls: ['/_ah/health', '/api/status'],
    ignoreMethods: ['OPTIONS'],
    samplingRate: 10,
    bufferSize: 1000,
    onUncaughtException: 'ignore',
  });
  // [END trace_setup_nodejs_implicit]
};

const express = await require('express');

我希望这可以为其他人服务,避免让我头疼:)