Серверная часть Jaeger не получает никаких данных (используя клиент Jager Node.js)

Я пытаюсь получить небольшой пример работы Jaeger с использованием Node.js, но я не могу заставить пользовательский интерфейс Jaeger отображать какие-либо данные или показывать что-либо.

Я прочитал этот вопрос: uber/jaeger-client-node: бэкэнд не будет получать данные, но в моем случае это не помогло.

Я запускаю серверную часть Jaeger в док-контейнере, используя:

docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest

Код для моего примера:

var initTracer = require('jaeger-client').initTracer;

// See schema https://github.com/jaegertracing/jaeger-client-node/blob/master/src/configuration.js#L37
var config = {
  'serviceName': 'my-awesome-service'
};
var options = {
  'tags': {
    'my-awesome-service.version': '1.1.2'
  }
  //'metrics': metrics,
  //'logger': logger
};
var tracer = initTracer(config, options);

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

// Handle a GET request on the root path
app.get('/', (req, res) => {
    const span = tracer.startSpan('http_request');
    res.send('Hello Jaeger');
    span.log({'event': 'request_end'});
    span.finish();
});

// Set up server
const server = app.listen(8000, () => {
    let host = server.address().address;
    let port = server.address().port;

    console.log('Service_1 listening at http://%s:%s', host, port);
});

Любая помощь относительно того, что я делаю неправильно, будет высоко оценена!


person ChilledPanda    schedule 08.12.2017    source источник


Ответы (2)


Вам нужно добавить еще несколько свойств в параметры конфигурации. Для репортера, развернутого на локальном хосте, и стратегии локального семплера:

var config = {
  'serviceName': 'my-awesome-service',
  'reporter': {
    'logSpans': true,
    'agentHost': 'localhost',
    'agentPort': 6832
  },
  'sampler': {
    'type': 'probabilistic',
    'param': 1.0
  }
};

Замените localhost именем сервера или маршрута, чтобы выбрать другой хост для среды выполнения Jeager.

person lbroudoux    schedule 11.12.2017
comment
Спасибо, я подумал после проверки кода пакета jaeger-client-node, что если ни одно из этих полей не указано, то он создаст сэмплер и репортер с настройками по умолчанию, но это решило мою проблему. Спасибо еще раз! - person ChilledPanda; 12.12.2017
comment
Если вы похожи на меня и используете докер; не забудьте убедиться, что порт udp доступен из вашего приложения node js! Он не сильно жалуется, когда это не работает. - person worldsayshi; 11.02.2018
comment
@worldsayshi Не могли бы вы показать нам, как вы сделали порт UDP доступным из вашего приложения node js. Я новичок в Docker и думаю, что столкнулся с той же проблемой, я вижу промежутки, сгенерированные в журналах, но я не вижу свою службу в раскрывающемся списке пользовательского интерфейса Jaeger. Благодарю вас! - person Abhishek; 08.03.2018
comment
@Abhishek Это может не сильно помочь, но я объявил это под своим изображением jaeger в docker-compose.yml: + ports: - "5775:5775/udp" - "6831:6831/udp" - "6832:6832/udp" - "5778:5778" - "16686:16686" - "14268:14268" - "9411:9411" - person worldsayshi; 12.03.2018
comment
И я также добавил соответствующие объявления портов в свой файл docker-compose.yml для своего образа node.js: `- 6831:6831/udp - 6832:6832/udp` - person worldsayshi; 12.03.2018
comment
Спасибо @worldsayshi. Моя проблема заключалась в том, что я не указывал agentHost в своем клиенте. Я добавил 'agentHost': '192.168.99.100', 'agentPort': 6832, и теперь я вижу свой сервис в пользовательском интерфейсе Jaeger. - person Abhishek; 13.03.2018
comment
Если вы развертываете свой сервис в Kubernetes, обязательно укажите agentHost просто как «jaeger-agent» (если вы используете образ «все в одном» по умолчанию) и не добавляйте к нему префикс http:// или https://. . - person Ultimate_93; 12.04.2020

Я потратил почти два дня, чтобы понять это. Он не работает с «agentHost»: «localhost», когда вы запускаете свои контейнеры с помощью отдельных команд docker-compose. У меня был один микросервис nodeJS и один контейнер для jaeger, и у меня работала следующая комбинация.

  1. Первый шаг — создать сеть, которая будет использоваться для запуска всех ваших сервисов, а также контейнера Jaeger.

    docker network create -d bridge my_network (replace my_network with your desired network name)
    
  2. Создайте контейнер Jaeger, работающий в той же сети.

    docker run --network my_network --name jaeger -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
    
  3. Создайте папку, создайте файл app.js и вставьте следующий код, чтобы создать микрослужбу nodeJS.

     const express = require("express");
     var http = require("http");
     const app = express();
     const port = 8082;
     const serviceName = process.env.SERVICE_NAME || "service-a";
    
     // Initialize the Tracer
     const tracer = initTracer(serviceName);
     const opentracing = require("opentracing");
     opentracing.initGlobalTracer(tracer);
    
    // Instrument every incomming request
    app.use(tracingMiddleWare);
    
    // Let's capture http error span
    app.get("/error", (req, res) => {
     res.status(500).send("some error (ノ ゜Д゜)ノ ︵ ┻━┻");
    });
    
    app.get("/sayHello/:name", (req, res) => {
     const span = tracer.startSpan("say-hello", , { childOf: req.span });
     // Parse the handler input
     const name = req.params.name
    
     // show how to do a log in the span
     span.log({ event: 'name', message: `this is a log message for name ${name}` })
     // show how to set a baggage item for context propagation (be careful is expensive)
     span.setBaggageItem('my-baggage', name)
     span.finish()
     res.send(response);
    });
    
    app.disable("etag");
     app.listen(port, () =>
       console.log(`Service ${serviceName} listening on port ${port}!`)
    );
    
     function initTracer(serviceName) {
      var initTracer1 = require("jaeger-client").initTracer;
    
      // See schema https://github.com/jaegertracing/jaeger-client-node/blob/master/src/configuration.js#L37
      var config = {
        serviceName: serviceName,
        reporter: {
         logSpans: true,
         agentHost: "jaeger",
         agentPort: 6832,
        },
        sampler: {
         type: "probabilistic",
         param: 1.0,
        },
       };
       var options = {
        logger: {
         info: function logInfo(msg) {
          console.log("INFO ", msg);
         },
         error: function logError(msg) {
          console.log("ERROR", msg);
         },
        },
       };
    
      return initTracer1(config, options);
     }
    
     function tracingMiddleWare(req, res, next) {
      const tracer = opentracing.globalTracer();
      const wireCtx = tracer.extract(opentracing.FORMAT_HTTP_HEADERS, req.headers);
      // Creating our span with context from incoming request
      const span = tracer.startSpan(req.path, { childOf: wireCtx });
      // Use the log api to capture a log
      span.log({ event: "request_received" });
    
      // Use the setTag api to capture standard span tags for http traces
      span.setTag(opentracing.Tags.HTTP_METHOD, req.method);
      span.setTag(
       opentracing.Tags.SPAN_KIND,
       opentracing.Tags.SPAN_KIND_RPC_SERVER
      );
      span.setTag(opentracing.Tags.HTTP_URL, req.path);
    
      // include trace ID in headers so that we can debug slow requests we see in
      // the browser by looking up the trace ID found in response headers
      const responseHeaders = {};
      tracer.inject(span, opentracing.FORMAT_HTTP_HEADERS, responseHeaders);
      res.set(responseHeaders);
    
      // add the span to the request object for any other handler to use the span
      Object.assign(req, { span });
    
      // finalize the span when the response is completed
      const finishSpan = () => {
       if (res.statusCode >= 500) {
       // Force the span to be collected for http errors
       span.setTag(opentracing.Tags.SAMPLING_PRIORITY, 1);
       // If error then set the span to error
       span.setTag(opentracing.Tags.ERROR, true);
    
       // Response should have meaning info to futher troubleshooting
       span.log({ event: "error", message: res.statusMessage });
      }
      // Capture the status code
      span.setTag(opentracing.Tags.HTTP_STATUS_CODE, res.statusCode);
      span.log({ event: "request_end" });
      span.finish();
     };
     res.on("finish", finishSpan);
     next();
    }
    

Я взял ссылку на приведенный выше код с https://github.com/ibm-cloud-architecture/learning-distributed-tracing-101 из папки lab-jaeger-nodejs/solution/service-a/app.js.

  1. Создайте package.json в той же папке nodeJS, где вышеприведенный файл app.js создается со следующим кодом.

     {
      "name": "service",
      "version": "0.0.0",
      "scripts": {
       "start": "node app.js",
       "debug": "npm start",
      },
      "dependencies": {
       "express": "^4.17.1",
       "jaeger-client": "^3.15.0"
      },
      "devDependencies": {
       "standard": "^14.0.2"
     }
    }
    
  2. Создайте файл DOCKER в той же папке nodeJS со следующим кодом

     FROM node:12.9.1
    
     # Create app directory
     WORKDIR /usr/src/app
    
     COPY package.json .
    
     RUN npm install
     # If you are building your code for production
     # RUN npm ci --only=production
    
     # Bundle app source
     COPY . .
    
     EXPOSE 8082
     CMD [ "npm", "start" ]
    
  3. Создайте файл docker-compose.yaml в той же папке.

     version: "3.7"
      services:
       service-a:
        build: ./service-a
        ports:
         - "8082:8082"
        networks:
         - my_network
      networks:
       my_network:
        external: true
        name: my_network
    
  4. Теперь выполните следующие команды из терминала. Это запустит приложение nodeJS в контейнере докеров.

       docker-compose build
       docker-compose up
    
  5. Теперь запустите http://localhost:8082/sayHello/John. Вы увидите ответ. Затем откройте http://localhost:16686/ и вы сможете увидеть пользовательский интерфейс Jaeger с поиском. Ищите сервис-а и сможете найти следы.

person Nitesh Malviya    schedule 29.07.2021