Observability:Synthetic monitoring - 动手实践

news2024/11/28 5:48:09

 在我之前的如下文章里:

  • Observability:Synthetic monitoring - 合成监测入门(一)(二)

  • Observability:Synthetic monitoring - 创建浏览器监测,配置单独的浏览器监测器及项目

我详细地描述了如何使用 Elastic 的 Synthetic monitoring 来创建轻量级 HTTP/S、TCP 和 ICMP 监测器及浏览器监测器。

安装

我们需要按照之前文章 “Observability:Synthetic monitoring - 合成监测入门(一)” 来安装 Elasticsearch, Kibana, Fleet Server 及 Elastic Agents。在安装完毕后,我们可以看到 Agent 的状态是 Healthy 的。

准备展示应用

我们参照文章 “一个问题的两个方面:使用合成监测将测试和监测相结合”。文章里有介绍一个 demo 应用。我们使用如下的方法来下载下来:

git clone https://github.com/carlyrichmond/synthetics-replicator

为了能够正常运行该应用我们需要全局安装 Nx:

npm install --global nx@latest
$ npm install --global nx@latest

changed 123 packages, and audited 124 packages in 15s

19 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice 
npm notice New major version of npm available! 8.19.2 -> 9.8.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.8.1
npm notice Run npm install -g npm@9.8.1 to update!
npm notice 

当然,我们也需要安装 npm:

npm install -g npm

我们进入到项目的根目录下,并打入如下的命令:

npm install
nx serve synthetics-replicator

我们使用如下的命令来运行服务器:

nx serve synthetics-replicator

从上面的输出中,我们可以看到服务器运行于 http://localhost:5173/。我们可以在浏览器中打开:

在我们的 Fleet 及 Elastic Agent 的部署中,我们使用 docker 来进行部署的。Docker 里的容器只能访问外部地址。如果我们的服务运行于 localhost 上,那么容器会在自己的内部寻找这个服务器,而不会访问我们部署的这个 web 服务器。为此,我参照之前的文章 “Kibana:创建一个 webhook alert - Elastic Stack 8.2”,并运行如下的命令:

bore local 5173 --to bore.pub
$ bore local 5173 --to bore.pub
2023-07-21T06:43:55.131881Z  INFO bore_cli::client: connected to server remote_port=25086
2023-07-21T06:43:55.131970Z  INFO bore_cli::client: listening at bore.pub:25086

从上面的输出中,我们可以看到,服务器被置于一个外部可以访问的地址。我们可以通过浏览器来进行访问:

很显然,我们的服务器已经成功地运行起来了。

获取 Private API key

为了方便下面的操作,我们需要获得访问位置的 Private API key:

我们拷贝上面的 API key 以供下面进行使用。 

运行监测器 

在运行测试器之前,我们先针对 package.json 做一点小的改动:

package.json

...

  "scripts": {
    "start": "nx serve synthetics-replicator",
    "build": "nx build synthetics-replicator",
    "test": "cd apps/synthetics-replicator-tests && npm run test",
    "push": "cd apps/synthetics-replicator-tests && npx @elastic/synthetics push"
  },


...

我增加了一个 push 的指令。

我们可以检查配置文件:

$ pwd
/Users/liuxg/nodejs/synthetics-replicator/apps/synthetics-replicator-tests
$ ls
README.md            lightweight          package.json
journeys             package-lock.json    synthetics.config.ts

在上述的目录中,我们可以查看到文件 synthetics.config.ts。它的内容如下:

import type { SyntheticsConfig } from '@elastic/synthetics';

export default env => {
  const config: SyntheticsConfig = {
    params: {
      url: 'http://localhost:5173',
    },
    playwrightOptions: {
      ignoreHTTPSErrors: false,
    },
    /**
     * Configure global monitor settings
     */
    monitor: {
      schedule: 10,
      locations: ['united_kingdom'],
      privateLocations: [],
    },
    /**
     * Project monitors settings
     */
    project: {
      id: 'synthetics-replicator-tests',
      url: 'https://fe8f3eff95d246c6a166d76a9dff6090.uksouth.azure.elastic-cloud.com:443',
      space: 'default',
    },
  };
  if (env === 'production') {
    config.params = { url: 'https://synthetics-replicator.netlify.app/' }
  }
  return config;
};

从上面的配置中,我们可以看到针对 production 环境它配置是一个在云上运行的服务器,我们可以使用我们本地部署的服务器:

synthetics.config.ts

import type { SyntheticsConfig } from '@elastic/synthetics';

export default env => {
  const config: SyntheticsConfig = {
    params: {
      url: 'http://localhost:5173/',
    },
    playwrightOptions: {
      ignoreHTTPSErrors: false,
    },
    /**
     * Configure global monitor settings
     */
    monitor: {
      schedule: 3,
      locations: [],
      privateLocations: ['Beijing'],
    },
    /**
     * Project monitors settings
     */
    project: {
      id: 'synthetics-replicator-tests',
      url: 'http://127.0.0.1:5601',
      space: 'default',
    },
  };
  if (env === 'production') {
    config.params = { url: 'http://bore.pub:25086/' }
  }
  return config;
};

请注意在上面,我们修改了 monitor 部分的 location 部分。我们可以通过如下的命令来列出可用的位置:

elastic-synthetics locations --url http://127.0.0.1:5601 --auth MU5VZWQ0a0JXdWJyOWhDdXlQeS06U2txQmFBajZTODZqR2hMOXlXVFhCQQ==
$ elastic-synthetics locations --url http://127.0.0.1:5601 --auth MU5VZWQ0a0JXdWJyOWhDdXlQeS06U2txQmFBajZTODZqR2hMOXlXVFhCQQ==
Available locations: 
   * Beijing(private)
   
Set default location for monitors via
  - Synthetics config file 'monitors.locations' | 'monitors.privateLocations' field
  - Monitor API 'monitor.use({ locations: ["japan"], privateLocations: ["custom-location"] }'

上面表明,我们当地的 Kibana 中含有一个位置 Beijing

接下来,我们运行本地测试。如果本地测试通过了的话,那么我们再上传到 Kibana 中进行测试:

$ pwd
/Users/liuxg/nodejs/synthetics-replicator/apps/synthetics-replicator-tests
$ npm install

added 158 packages, and audited 159 packages in 28s

18 packages are looking for funding
  run `npm fund` for details

1 moderate severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
$ cd ../../
$ npm run test

> synthetics-replicator@0.0.0 test
> cd apps/synthetics-replicator-tests && npm run test


> synthetics-replicator-tests@1.0.0 test
> npx @elastic/synthetics journeys


Journey: Recorded Order journey
   ✓  Step: 'Go to order items page' succeeded (7956 ms)
   ✓  Step: 'Add item to cart successfully' succeeded (247 ms)
   ✓  Step: 'Add 2nd item to cart successfully' succeeded (68 ms)
   ✓  Step: 'Add 3rd item to cart successfully' succeeded (66 ms)

Journey: Replicator Order Journey
   ✓  Step: 'assert home page loads' succeeded (108 ms)
   ✓  Step: 'assert move to order page' succeeded (120 ms)
   ✓  Step: 'assert adding to order' succeeded (233 ms)

 7 passed (19801 ms) 

很显然,我们的本地测试是成功的。这非常好!我们接下来把我们的测试上传到 Kibana 中。请注意在上面的本地测试中,我们使用的服务器地址是 http://localhost:5173/。为了能够使得传达 Kibana 中也能正常测试,我们必须使用地址  bore.pub:33741。为此,我们需要配置环境变量:

export NODE_ENV=production
export SYNTHETICS_API_KEY=MU5VZWQ0a0JXdWJyOWhDdXlQeS06U2txQmFBajZTODZqR2hMOXlXVFhCQQ==

为了能够对轻量级 HTTP/S、TCP 和 ICMP 监测器提供支持,我们需要修改如下的文件:

$ pwd
/Users/liuxg/nodejs/synthetics-replicator/apps/synthetics-replicator-tests/lightweight
$ ls
heartbeat.yml

我们需要把文件里的 urls 改成我们自己的。在这里,我们使用网上部署的网站来进行测试。

heartbeat.yml

heartbeat.monitors:
- type: http
  name: Replicator HTTP ping
  id: synthetics-replicator-monitor-http
  enabled: true
  urls: "https://synthetics-replicator.netlify.app/"
  schedule: '@every 3m'
  timeout: 16s

注意:可能是由于 bore 带来的问题。在上述配置中,如果我选择配 urls 为 bore.pub:25086 的话,返回的 HTTP 结果不完整而导致错误。另外一种方法是使用 nginx 把  http://localhost:5173/ 映射到电脑的私有地址,这样我们就不必使用 bore 来变为共有地址。

接下来,我们运行如下的命令:

npm run push

上面显示我们的上传是成功的。我们回到 Kibana 的界面:

如上所示,当前的测试显示是绿色的。它表明所有的测试是成功的。我们可以点击进去其中的一个测试,比如 Replicator Order Journey:

  

我们点击进去其中的一个 journey:

我们可以查看一下 journey 的具体写法:

$ pwd
/Users/liuxg/nodejs/synthetics-replicator/apps/synthetics-replicator-tests
$ ls
README.md            lightweight          package-lock.json    synthetics.config.ts
journeys             node_modules         package.json
$ cd journeys/
$ ls
orders-generated.journey.ts orders.journey.ts

 orders.journey.ts

import { journey, step, monitor, expect, before } from '@elastic/synthetics';

journey('Replicator Order Journey', ({ page, params }) => {
  // Only relevant for the push command to create
  // monitors in Kibana
  monitor.use({
    id: 'synthetics-replicator-monitor',
    schedule: 3,
  });

  before(async ()=> {
    await page.goto(params.url);
  });

  step('assert home page loads', async () => {
    const header = await page.locator('h1');
    expect(await header.textContent()).toBe('Replicatr');
  });

  step('assert move to order page', async () => {
    const orderButton = await page.getByTestId('order-button');
    await orderButton.click();

    const url = page.url();
    expect(url).toContain('/order');

    const menuTiles = await page.getByTestId('menu-item-card');
    expect(await menuTiles.count()).toBeGreaterThan(2);
  });

  step('assert adding to order', async () => {
    const addItemButtons = await page.getByTestId('add-item-button');
    expect(await addItemButtons.count()).toBeGreaterThan(10);

    const cartCount = await page.getByTestId('cart-count-label');
    expect(await cartCount.innerText()).toBe('0');

    await addItemButtons.first().click();
    expect(await cartCount.innerText()).toBe('1');

    await addItemButtons.nth(4).click();
    await addItemButtons.last().click();
    expect(await cartCount.innerText()).toBe('3');
  });
});

从上面我们可以看出来:

  • 该测试每隔 3 分钟做一次测试
  •  首先它去首页,它显示的截图为:

  • 紧接着查看 h1 里的文字是不是 Replicator: 
  step('assert home page loads', async () => {
    const header = await page.locator('h1');
    expect(await header.textContent()).toBe('Replicatr');
  });

如果是成功的话,就点击去 order 页面:

  • 点击进入 order 页面:
  step('assert move to order page', async () => {
    const orderButton = await page.getByTestId('order-button');
    await orderButton.click();

    const url = page.url();
    expect(url).toContain('/order');

    const menuTiles = await page.getByTestId('menu-item-card');
    expect(await menuTiles.count()).toBeGreaterThan(2);
  });

 

  • 添加 order:
  step('assert adding to order', async () => {
    const addItemButtons = await page.getByTestId('add-item-button');
    expect(await addItemButtons.count()).toBeGreaterThan(10);

    const cartCount = await page.getByTestId('cart-count-label');
    expect(await cartCount.innerText()).toBe('0');

    await addItemButtons.first().click();
    expect(await cartCount.innerText()).toBe('1');

    await addItemButtons.nth(4).click();
    await addItemButtons.last().click();
    expect(await cartCount.innerText()).toBe('3');
  });

在上面的代码中个:检测添加 button 多于 10 个。    

检查购物车里的数量为 0:

第一个物品的添加按钮:

连续点击两次,那么购物车里的数值为 3: 

 

至此这个 journey 的测试完毕。如果有异常就会报错。

使用 Nginx 来反向代理 web 服务器

在上面,我们使用 bore 来暴露私有地址,并可以在互联网上进行访问。在本地测试中,我们甚至可以使用 Nginx 来反向代理把 http://localhost:5173 的地址变为 http://private:5173 来进行访问。这样我们的 docker 里的服务器就可以访问这个地址了。

我们需要针对 Nginx 来进行配置:

nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

   server {
        listen *:5173;

        server_name $hostname localhost;
        location / {
            proxy_pass http://localhost:5173/;
        }
    }
  
  ..
}

在配置完上面的 nginx.conf 后,在 macOS 上,我们可以使用如下的命令来重新启动 Nginx 服务:

brew services restart nginx

如果你使用 Linux 操作系统,你可以使用如下的命令:

sudo systemctl restart nginx

或者:

sudo service nginx restart

等启动完毕后,我们可以在浏览器中重新进行测试:

我们需要重新配置之前的一些文件:

synthetics.config.ts 

import type { SyntheticsConfig } from '@elastic/synthetics';

export default env => {
  const config: SyntheticsConfig = {
    params: {
      url: 'http://localhost:5173/',
    },
    playwrightOptions: {
      ignoreHTTPSErrors: false,
    },
    /**
     * Configure global monitor settings
     */
    monitor: {
      schedule: 3,
      locations: [],
      privateLocations: ['Beijing'],
    },
    /**
     * Project monitors settings
     */
    project: {
      id: 'synthetics-replicator-tests',
      url: 'http://127.0.0.1:5601',
      space: 'default',
    },
  };
  if (env === 'production') {
    config.params = { url: 'http://192.168.0.3:5173/' }
  }
  return config;
};

如上所示,192.168.0.3 是我的电脑的私有地址。

在进行下面的操作之前,我们需要删除之前的所有的监控器及之前创建的 Beijing 私有地址。 我们重新创建私有位置 Beijng 地址: 

 

 

我们再次上传监测器:

$ pwd
/Users/liuxg/nodejs/synthetics-replicator
$ ls
LICENSE            jest.config.ts     nx.json            tsconfig.base.json
README.md          jest.preset.js     package-lock.json  vitest.config.ts
apps               libs               package.json
docs               node_modules       tools
$ npm run push

> synthetics-replicator@0.0.0 push
> cd apps/synthetics-replicator-tests && npx @elastic/synthetics push

⚠ Lightweight monitor schedules will be adjusted to their nearest frequency supported by our synthetics infrastructure.
> Pushing monitors for project: synthetics-replicator-tests
> Monitor Diff: Added(3) Updated(0) Removed(0) Unchanged(0)
> bundling 3 monitors
> creating or updating 3 monitors (6364ms)
✓ Pushed: http://127.0.0.1:5601/app/synthetics/monitors

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于RASC的keil电子时钟制作(瑞萨RA)(3)----使用J-Link烧写程序到瑞萨芯片

基于RASC的keil电子时钟制作3_使用J-Link烧写程序到瑞萨芯片 概述硬件准备视频教程软件准备hex文件准备J-Link与瑞萨开发板进行SWD方式接线烧录 概述 这一节主要讲解如何使用J-Link对瑞萨RA芯片进行烧录。 硬件准备 首先需要准备一个开发板,这里我准备的是芯片型…

【Node.js 安装】Node.js安装与使用教程

Node.js 安装 Node.js 是什么那什么是运行时 如何安装 Node.jsNode 使用教程 Node.js 是什么 先说结论,Node.js 它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行 JavaScript 诞生于 1995 年,几乎是和互联网同时出现&#xf…

leetcode-206.反转链表

leetcode-206.反转链表 文章目录 leetcode-206.反转链表一.题目描述二.代码提交三.易错点 一.题目描述 二.代码提交 代码 class Solution {public:ListNode *reverseList(ListNode *head) {ListNode *temp; // 保存cur的下一个节点ListNode *cur head;ListNode *pre nullptr…

scikit-learn集成学习代码批注及相关练习

一、代码批注 代码来自:https://scikit-learn.org/stable/auto_examples/ensemble/plot_adaboost_twoclass.html#sphx-glr-auto-examples-ensemble-plot-adaboost-twoclass-py import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import …

【stable diffusion】保姆级入门课程02-Stable diffusion(SD)图生图-基础图生图用法

目录 学前视频 0.本章素材 1.图生图是什么 2.图生图能做什么 3.如何使用图生图 4.功能区域 4.1.提示词区域 4.2.图片提示词反推区域 1.CLIP反推 2.DeepBooru 反推 4.3.图片上传区域 4.4.结果图区域 4.5.缩放模式 4.6.重绘幅度 7.结语 8.课后训练 学前视频 …

【Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题,本文将稍作更改,以便能够顺利运行。 1 Ordered Bar Chart 有序条形图有效地传达项目的排名顺序。但是,将图表上方的指标值相加,用户将从图表本身获得准确的信息…

制造业想要数字化转型应该从哪方面入手?

制造业可以通过关注以下几个关键领域来开启数字化转型之旅: 数据收集和分析:实施系统收集和分析来自各种来源(例如机器、传感器和生产过程)的数据至关重要。这些数据可以提供有关运营效率、质量控制和预测性维护的见解。 物联网&…

Flask Bootstrap 导航条

(43条消息) Flask 导航栏,模版渲染多页面_U盘失踪了的博客-CSDN博客 (43条消息) 学习记录:Bootstrap 导航条示例_bootstrap导航栏案例_U盘失踪了的博客-CSDN博客 1,引用Bootstrap css样式,导航栏页面跳转 2,页面两列…

【冒泡排序】模仿qsort的功能实现一个通用的冒泡排序

文章目录 前言曾经学的冒泡排序存在着一些局限性首先第一步:写一个main()函数,分装一个test1函数test1函数 用来描写类型的性状 在test1创建了bubble_int 函数,下一步就是实现它,分两步走步骤一:写函数参数步骤二&…

Matlab论文插图绘制模板第107期—标签散点图

在之前的文章中,分享了Matlab散点图绘制模板: 进一步,再来分享一种特殊的散点图:标签散点图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需…

内网穿透远程查看内网监控摄像头

内网穿透远程查看内网监控摄像头 在现代社会中,大家总是奔波于家和公司之间。大部分时间用于工作中,也就很难及时知晓家中的动态情况,对于家中有老人、小孩或宠物的(甚至对居住环境安全不放心的),这已然是…

ubuntu下tmux安装

目录 0. 前言1. Tmux介绍2. 安装3. 验证安装 0. 前言 本节安装tmux终端复用工具,在Ubuntu中运行一些服务或脚本的时候往往不能退出终端,需要一直挂着。在有图形界面的linux中你还可以新开一个终端去做别的事,但是在无界面linux中&#xff0c…

re学习(22)伪造CTF(谜之操作)

思维导图:找flag关键之处 1.字符串 (flag, sorry) 2.导入函数:(Import _scanf ) 其他函数(敏感函数) createfileA:将flag放在一个文件中 Createprocess&am…

基于HCL的​​​​​​​网络规划与部署综合实训报告

0、前言 本次实验是对之前有关网络规划与综合部署的综合实验,适合入门的同学们进行学习,该实验选择了使用华三模拟器进行,希望能够帮助大家了解相关的指令。 一、实训目的及意义 ① 掌握网络规划和设计的基本流程 从需求分析开始做起&#x…

4-2 3D images: Volumetric data Representing tabular data

本文所用到的资料下载地址 By stacking individual 2D slices into a 3D tensor, we can build volumetric data representing the 3D anatomy of a subject. We just have an extra dimension, depth, after the channel dimension, leading to a 5D tensor of shape N C D…

【MySQL进阶(三)】 InnoDB体系架构之内存池(buffer pool)

InnoDB体系架构之内存池 一、InnoDB 体系结构二、缓冲池 buffer pool内部结构free 链(管理空闲缓冲页)怎么知道数据页是否被缓存? flush 链表(管理脏页)1. 脏页2. 链表结构3. 刷盘时机 LRU 链表(控制数据热…

blender 纹理材质

添加材质纹理需要哪五个节点? 映射节点:调整纹理的位置、大小、缩放; 纹理坐标:怎么映射,以什么方式去映射这张图,换句话说就是如何将 2D 的图片映射到 3D 的图像上;纹理坐标就是以什么坐标方式…

【学会动态规划】下降路径最小和(8)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

Rust学习01:D-day

以前自学过Python,开发了一些小程序,用于工作中提升效率。 Python的确好学易用,但用来做一个真正意义上的产品,哪怕是比较简单的产品,差点意思,特别是在移动端开发领域。 Rust看了两本书,准备动…

剑指offer61.扑克牌中的顺子

我的想法非常简单,就是先给数组排序,然后统计里面有几个0,然后遍历数组,如果是0或者比后面一个数小1就直接进入下一次循环,如果比后面一个数小2,就用掉一个0,0的数量减1,如果比后面的…