elk笔记21--将DSL查询转为kibana短链接

2023-11-05

elk笔记21--将DSL查询转为kibana短链接

1 简介

较新版本的 kibana 前端都有一个 Share -> Short URL 的功能,用起来非常方便。因此想着能否将该功能用代码自动生成,将其集成到告警通知中,让用户收到告警通知的时候可以通过短链接快速定位到错误原因。

查询文档发现官方提供 Shorten URL API 实现锻炼功能,该功能处于实验阶段,没有详细的参数介绍,因此需要自己结合kibana 的url 和查询的字段分析其参数生成模式。笔者多次测试后, 结合shorten_url 和 query 语句实现该功能,分享在这里供有需要的小伙伴们学习。

2 功能实现

kibana 官方文档 Shorten URL API 的介绍相当简洁,提供了一个很简单的案例,然而并没有介绍 url 中的参数,因此还需要自己通过开发工具一步步测试验证。

笔者在完成这个demo的时候,也是结合kibana URL、share-> PERMALINK-> Short URL-> Chrome 开发工具, 多次对比才找到处一种比较可靠的方式。

主要过程:

  1. 根据用户的index pattern 找到其index pattern id,对应请求方法可以在刷新index pattern 的时候通过 Chrome 找到kibana 查询函数;
  2. 用户输入query请求,将请求封装为符合kibana查询需求的url, 然后通过 /api/shorten_url 生成一个urlId,将urlId 拼装为一个kibana 的短链接即可;
  3. 用户点击短链接的时候,kibana会自动将其解析为具体的查询条件,通过该条件查询数据并显示给用户。

以下为源码实现和测试过程

2.1 源码

源码结构如下:
alarm_shorten_url$ tree -L 2
.
├── generate_url.py
├── readme.md
└── rison
    ├── constants.py
    ├── decoder.py
    ├── encoder.py
    ├── __init__.py
    └── utils.py

1)从 [github pifantastic/python-rison](https://github.com/pifantastic/python-rison) 下载rison库, 注意 py3 没有basestring类型,因此需要修改 basestringstr,否则会报错;
按需拷贝python-rison 的 rison 目录即可,此处就不再贴一长串代码了;

2)按需获取 index pattern id, 然后组装kibana url 中的参数

vim generate_url.py 
#!/usr/bin/pytnon3
# -*- coding:utf-8 -*-

import sys
import requests
from base64 import b64encode
sys.path.append('./rison')
import rison


def get_base64_str(str_text):
    str_user_pwd = b64encode(str_text.encode('ascii'))
    return str_user_pwd.decode('ascii')


def generate_rison(bool_query):
    ret = rison.dumps(bool_query)
    return ret


class GenerateShortUrl:
    def __init__(self, base_url, user, pwd, time_from, time_to, index_pattern, bool_query):
        """

        :param base_url:
        :param user:
        :param pwd:
        :param time_from: 'now-15d'
        :param time_to: 'now'
        :param index_pattern: 'kibana_sample_data_logs'
        :param bool_query:
        注: 本函数只验证了一个完整类型的bool查询,
        因此bool_query_dict必须是 {"query": {"bool":{ ...must,must_not,should...}}}
        """
        self.base_url = base_url
        self.user = user
        self.pwd = pwd
        self.time_from = time_from
        self.time_to = time_to
        self.index_pattern = index_pattern
        self.bool_query = bool_query

    def get_index_pattern_id(self):
        url = f'{self.base_url}/api/saved_objects/_find?fields=title&fields=type&per_page=10000&type=index-pattern'
        headers = {'Authorization': 'Basic ' + get_base64_str(self.user + ':' + self.pwd)}
        ret = requests.get(url=url, headers=headers)
        for item in (ret.json())['saved_objects']:
            if item['attributes']['title'] == self.index_pattern:
                return item['id']
        return None

    def generate_shorten_url(self):
        url = f'{self.base_url}/api/shorten_url'
        index_pattern_id = self.get_index_pattern_id()
        bool_query_rison = generate_rison(self.bool_query)
        url_dict = {"url": f"/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),"
                           f"time:(from:{self.time_from},to:{self.time_to}))&_a=(columns:!(_source),"
                           f"filters:!({bool_query_rison}),index:'{index_pattern_id}',interval:auto,"
                           f"query:(language:lucene,query:''),sort:!())"}
        headers = {'Authorization': 'Basic ' + get_base64_str(self.user + ':' + self.pwd), 'kbn-xsrf': 'reporting'}
        ret = requests.post(url=url, json=url_dict, headers=headers)
        ret_dict = ret.json()
        return f'{self.base_url}/goto/' + ret_dict['urlId']


def test_case01():
    base_url = 'http://127.0.0.1:5601'
    user = "elastic"
    pwd = "elastic"
    index_pattern_name = 'kibana_sample_data_logs'
    bool_query = {
        "query": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "tags.keyword": {
                                "value": "error"
                            }
                        }
                    },
                    {
                        "term": {
                            "response.keyword": {
                                "value": "200"
                            }
                        }
                    }
                ]
            }
        }
    }
    time_from = 'now-15d'
    time_to = 'now'
    gen_url_obj = GenerateShortUrl(base_url, user, pwd, time_from, time_to, index_pattern_name, bool_query)
    index_pattern_id = gen_url_obj.get_index_pattern_id()
    short_url = gen_url_obj.generate_shorten_url()
    print(f'{index_pattern_name} id= {index_pattern_id}\n{short_url}')


if __name__ == '__main__':
    test_case01()

2.2 测试

  1. 执行输出

  2. kibana 前端
    点击链接后会自动跳转到查询界面,可以在filter 处看到代码中的query语句,如下图所示:
    在这里插入图片描述
    在这里插入图片描述

3 注意事项

  1. 直接在kibana 前端添加filter后,它会在url 中多出一部分query 内容,而且被转化为url的格式,笔者实际测试的时候发现它和rison的内容是一致的,因此可以省略该部分,测试发现确实可以省略。
    如果想保持和kibana解析一致, 那么可以考虑使用 URL 转码 的方式对其进行转码,然后在生成短链接。
  2. 在本文测试中,为了简单高效暂时去掉了查询字段加亮选项,同时保持字段为_source, 有需要的话可以在 (columns:!(_source) 中添加自己需要的字段。
  3. 报错 Request must contain a kbn-xsrf header
    执行的时候出现如下错误:
     {"statusCode":400,"error":"Bad Request","message":"Request must contain a kbn-xsrf header."}
    
    解决方法:
    在headers 中添加 , ‘kbn-xsrf’: 'reporting’参数
    headers = {'Authorization': 'Basic ' + get_base64_str(USER + ':' + PWD), 'kbn-xsrf': 'reporting'}
    

4 说明

  1. 软件环境
    Ubuntu20.04 Desktop
    ES7.10
    python 3.8
  2. 参考文档
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elk笔记21--将DSL查询转为kibana短链接 的相关文章

  • Dask 在 Groupby 上复制 Pandas 值

    我想做的是在 dask 中复制 panda 的值计数 idxmax 函数 因为我有很多数据 这是一个示例数据框 partner num cust id item id revw ratg num revw dt item qty 0 100
  • Elastic Search Kibana PDF 报告

    我正在尝试生成 PDF 报告并使用脚本下载它们 我按照以下说明进行操作 https github com elastic kibana blob master docs user reporting automating report Ge
  • 在 MATLAB 中处理大型 CSV 文件

    我必须处理一个最大 2GB 的大 CSV 文件 更具体地说 我必须将所有这些数据上传到 mySQL 数据库 但在我必须对此进行一些计算之前 所以我需要在 MATLAB 中完成所有这些操作 我的主管也想在 MATLAB 中完成 因为他熟悉MA
  • 使用 AKS 时如何修复“Kibana 服务器尚未准备好”错误

    我正在 Azure Kubernetes 服务中设置 ELK 服务 但我只看到这个错误 Kibana 服务器尚未准备好 我使用 Helm 在 AKS 中安装稳定 弹性堆栈版本 无需进行任何更改 所有内容均默认 helm install na
  • 无法启动 Kibana 7.5.0 致命错误 未对配置文件进行任何更改

    启动 Kibana 7 5 时出现致命错误 我没有配置任何内容 我只是运行 elasticsearch bat 也是 v7 5 和 kibana bat error root cause type mapper parsing except
  • Kibana Logstash ElasticSearch | Kibana Logstash ElasticSearch无法搜索未索引的字段

    我正在探索 ELK 堆栈并遇到一个问题 我已经生成了日志 将日志转发到logstash 日志采用JSON格式 因此它们被直接推送到ES中 仅在Logstash配置中使用JSON过滤器 连接并启动指向ES的Kibana 日志存储配置 filt
  • 大稀疏矩阵到三角矩阵 R

    我在 R 中有一个非常大的 大约 9100 万个非零条目 sparseMatrix 如下所示 gt myMatrix a b c a 1 2 b 1 c 2 我想将其转换为三角矩阵 上或下 但是当我尝试 myMatrix myMatrix
  • 全新安装时的 HDFS 空间使用情况

    我刚刚安装了 HDFS 并启动了该服务 并且已使用空间已经超过800MB 它代表什么 hdfs dfs df h Filesystem Size Used Available Use hdfs quickstart cloudera 802
  • 获取文本字段中最常用的 10 个单词

    我有一个包含数千个文档的索引 每个文档都有一个全文字段 我想搜索所有这些字段并获取最常出现的 10 个最常见的单词 如果可能的话 我还想要一种在 Kibana 上可视化它的方法 实现此目的的最常见方法是使用keyword datatype
  • 分段读取 CSV 文件的策略?

    我的计算机上有一个中等大小的文件 4GB CSV 但没有足够的 RAM 来读取该文件 64 位 Windows 上为 8GB 在过去 我只是将其加载到集群节点上并将其读入 但我的新集群似乎任意将进程限制为 4GB RAM 尽管每台机器的硬件
  • 如何将非分区表转换为分区表

    如何使用 StandardSQL 或 LegacySQL 重命名 BigQuery 中的表 以便对之前未分区的表进行分区 我正在尝试使用 StandardSQL 但出现以下错误 重命名表dataset old table name TO d
  • 将 pandas 数据框中的行和上一行与数百万行进行比较的最快方法

    我正在寻找解决方案来加速我编写的函数 以循环遍历 pandas 数据帧并比较当前行和前一行之间的列值 例如 这是我的问题的简化版本 User Time Col1 newcol1 newcol2 newcol3 newcol4 0 1 6 c
  • 如何将 RDD 保存到 HDFS 中并稍后将其读回?

    我有一个 RDD 其元素类型为 Long String 由于某种原因 我想将整个 RDD 保存到 HDFS 中 然后在 Spark 程序中读回该 RDD 可以这样做吗 如果是这样 怎么办 有可能的 在RDD中你有saveAsObjectFi
  • 如何设置 Kibana SSO(通过 OAuth)? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我的公司非常努力地为所有第三方服务保留 SSO 我想让 Kibana 与我们的 Google Apps 帐户一起使用 那可能吗 如何
  • Logstash创建管道但未创建索引

    我正在尝试使用 json 文件在 elasticsearch 云上创建索引 我已经创建了如下所示的配置 input file path gt root leads json start position gt beginning ignor
  • 范围过滤器不适用于“gt”运算符,但适用于“lt”

    我正在使用弹性搜索来索引我的文档 并希望根据特定属性过滤文档 这是我的代码 filter push range audience ethnicity asian gt 50 它不适用于 gt 运算符 发回不一致的结果 但适用于 lt 运算符
  • elasticsearch中@timestamp和timestamp字段的区别

    当我使用日志存储向弹性搜索记录一些请求时 它将 timestamp 字段作为时间 当我使用 NEST 记录这些请求并设置时间戳字段时 它会放置时间戳字段 当我使用 kibana 查看数据时 这两个字段具有单独的名称 他们之间有什么区别 ti
  • Hive 中字符串数据类型是否有最大大小?

    谷歌了很多 但没有在任何地方找到它 或者这是否意味着只要允许集群 Hive 就可以支持任意大字符串数据类型 如果是这样 我在哪里可以找到我的集群可以支持的最大字符串数据类型大小 提前致谢 Hive 列表的当前文档STRING作为有效的数据类
  • 按字段关联 ELK 中的消息

    相关 在ELK中合并日志和查询 https stackoverflow com questions 28429607 combine logs and query in elk 我们正在设置 ELK 并希望在 Kibana 4 中创建可视化
  • 使用大矩阵操作

    我必须使用 big matrix 对象 并且无法计算某些函数 让我们考虑以下大矩阵 create big matrix object x lt as big matrix matrix sample 1 10 20 replace TRUE

随机推荐

  • Andriod getContext和getActivity

    原创文章 如有转载 请注明出处 http blog csdn net myth13141314 article details 62045162 MainActivity this 表示MainActivity对象 一般用在内部类中指示外面
  • STM32+FATFS文件系统连续在同一个txt文件里写入内容

    移植好fatfs文件系统之后 我们经常要在一个txt文件下写入数据 但是这些数据可能需要多次写入 那怎么办呢 通过这几天的学习 有以下函数可以帮助我们进行多次写入数据 1 打开文件 f open filescr2 0 201711022 t
  • CAN资料整理(三):CAN的位时间、同步、位定时

    目录 一 位时间 二 同步 1 硬同步 2 重新同步 三 位定时 1 传播段延迟时间的确定 2 位定时参数确定 由于CAN属于异步通讯 没有时钟信号线 连接在同一个总线网络中的各个节点会像串口异步通讯那样 节点间会使用约定好的波特率进行通讯
  • ROS+UR机械臂系列-1- 虚拟机及ROS安装

    ROS UR机械臂系列 1 虚拟机及ROS安装 小白 刚开始使用ROS系统 希望可以成一个系列 方便大家参考 避过大坑 最开始使用的是Ubuntu20 04 ROS noetic 遇到问题时 发现很多都在用Ubuntu18 04 ROS m
  • 解决pip安装包时出现 WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))

    错误描述 anaconda使用pip安装包时会出现无法下载的问题 或者pip直接无反应 可能会出现如下错误提示 WARNING Retrying Retry total 4 connect None read None redirect N
  • 微服务内部服务调用@Inner

    1 外部从Gateway访问 需要鉴权 eg CURD操作 这种是最常使 的 户登录后正常访问接 不需要我们做什么处理 可能有的接 需要加权限字段 2 外部从Gateway访问 不需要鉴权 eg 短信验证码 需要我们将uri加 到secur
  • SLF4J分析

    slf4j Simple Logging Facade for Java 为java提供的简单日志Facade Facade 门面 更底层一点说就是接口 他允许用户以自己的喜好 在工程中通过slf4j接入不同的日志系统 更直观一点 slf4
  • 基于matlab实现平均移动法

    平均移动法 基于matlab实现 代码如下 示例 clc clear load xy mat x y m length y n 4 5 6 7 10 20 n 为移动平均的项数 l length n for i 1 length n 由于
  • 阿里云服务器更换操作系统流程(新版教程)

    阿里云服务器操作系统选择后还可以更改吗 可以的 重装操作系统是免费的 但是需要注意中国大陆地域可以随意更换 中国香港 新加坡等非中国大陆地域的云服务器不支持Windows和Linux操作系统之间变换 阿里云百科来详细说下阿里云服务器重装操作
  • CentOS8、Ubuntu安装mysql5.7,修改密码、配置远程访问、开机自启、创建开发者账户(超级详细)

    下载MYSQL wget http dev mysql com get mysql80 community release el7 3 noarch rpm 安装MYSQL RPM 模块 rpm ivh mysql80 community
  • m3u8文件

    EXTM3U m3u文件头 必须放在第一行 起标示作用 EXT X VERSION 播放列表文件的兼容版本 若不存在此标记 则默认为协议的第一个版本 EXT X MEDIA SEQUENCE 播放列表中的每个媒体 URI 都有一个唯一的整数
  • docker容器内修改配置文件

    一 vim修改 1 进入容器内部 docker exec it id bin bash 2 安装vim 输入命令 apt get update apt get install vim 二 替换配置文件 1 替换配置文件 docker cp
  • 最火前端Web组态软件(可视化)

    前言 随着物联网 大数据等技术高速发展 我们逐步向数字化 可视化的人工智能 AI 时代的方向不断迈进 智能时代是工业 4 0 时代 我国工业领域正努力从 制造 迈向 智造 的新跨越 正文 1 mxgraph 介绍 开源免费 但是需要解决的问
  • CososCreator (Android)-AppLovin MAX 广告聚合平台接入+Firebase统计

    CososCreator 2 4 4 Android Studio 4 2 1 接入SDK有 接max聚合及中介平台 Admob FB applovin pangle mintegral vungle unity 和Firebase 统计
  • kubernetes(k8s)介绍

    记录自己的学习历程 应用部署方式演变 在部署应用程序的方式上 主要经历了三个时代 传统部署 互联网早期 会直接将应用程序部署在物理机上 优点 简单 不需要其它技术的参与 缺点 不能为应用程序定义资源使用边界 很难合理地分配计算资源 而且程序
  • 入门Webpack,看这篇就够了

    写在前面的话 阅读本文之前 先看下面这个webpack的配置文件 如果每一项你都懂 那本文能带给你的收获也许就比较有限 你可以快速浏览或直接跳过 如果你和十天前的我一样 对很多选项存在着疑惑 那花一段时间慢慢阅读本文 你的疑惑一定一个一个都
  • 笔试

    文章目录 前言 41 关键路径与路径优化 何为关键路径 怎么进行路径优化 1 组合逻辑中插入寄存器 插入流水线 2 寄存器平衡 重定时Retiming 3 操作符平衡 加法树 乘法树 4 消除代码优先级 case代替if else 5 逻辑
  • linux通过yum和官网下载jdk安装java步骤

    1 yum方式下载安装 1 查找java相关的列表 yum y list java 或者 yum search jdk 2 安装jdk yum install java 1 8 0 openjdk x86 64 3 完成安装后验证 java
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • elk笔记21--将DSL查询转为kibana短链接

    elk笔记21 将DSL查询转为kibana短链接 1 简介 2 功能实现 2 1 源码 2 2 测试 3 注意事项 4 说明 1 简介 较新版本的 kibana 前端都有一个 Share gt Short URL 的功能 用起来非常方便