原文链接:https://thaitran.hashnode.dev/how-to-code-like-a-pro-in-2022-and-avoid-if-else#comments-list 如果学习一门编程语言...,我们都会知道if...else......但是,许多高级开发人员都认为if...else...存在很多问题,而且我们在开发中也要尽量避免过度依赖if...else...。...怎样在2022年像专业人士一样摒弃if-else来编写代码? 使用if-else语句是我们在大学学习编程的基础之一,它有助于我们开始第一个任务。有趣的是,许多高级开发人员却很厌恶if-else语句。...这篇文章说的并不是完全拒绝if-else语句,而是说要尽量避免if-else语句带来的冗杂和难维护性。如果借助if-else能够使得语句更有效率,那当然还是用使用。
[TOC] 0x00 PromQL 介绍 1.基础简述 Q: 什么是PromQL?...语句通过内置表达式浏览器进行查询?...(1) 使用Prometheus的内置表达式浏览器,利用PromQL语句进行查询我们监控的指标。...表达式, 因此它们的计算成本相对较高。...Query 描述: 在给定的时间执行PromQL表达式并返回结果,注意其支持带入标签进行查询过滤的。
简单来说的话,就用很多if else if if(model.context.StartsWith("命令1") && model.from == "群1"){ // 处理命令1 对应的逻辑 }...else if(xxxx){ // 处理命令2 对应的逻辑 }else if(yyyy){ // 处理命令3 对应的逻辑 } // 继承BaseRobotAction抽象类实现Do方法...public string InitMethod { get; set; } = nameof(BaseRobotAction.Init); /// /// 表达式...; } } // 读取post body var robotMsg = await ReadBodyAsync(context.Request.Body); // 从容器中拿到表达式引擎...break; } 代码总体不超过200行,详细请移步 Demo https://github.com/yuzd/FastExpressionEngine/tree/master/Demo 字符串表达式执行引擎
总共需要重复写四遍 第二步优化,使用正则表达式。...再总结一下常用的正在表达式。 ?...条件 SELECT * FROM `test_t` WHERE NAME LIKE '%b%' AND NAME LIKE '%a%'; -- 若使用 SELECT * FROM `test_t`...WHERE NAME LIKE '%b%a%'; 则找不到 name_aB。。。...匹配单个任意字符,它常用来限制表达式的字符长度语句(可以代表一个中文字符) SELECT * FROM `test_t` WHERE NAME LIKE '_______'; -- 能查询到 name_aA
DSL parser 和 PromQL 这是promql的学习笔记,从promql的代码学习中,希望学习到的是:如何实现一个像promql的parser 先看两个算法题 1....Parse Lisp Expression 题目大意:表达式支持以下操作: 表达式可以是 integer, let-expression, add-expression, mult-expression...实现 本质上看,PromQL很类似上面列举的两个算法题,无非是求一个expresion,只是PromQL支持的能力要强大很多。...入口 PromQL本质就是实现下面的interface, 执行一个query,返回结果,支持取消、关闭和获取解析后表达式以及执行统计信息。...OP,是因为这里对program做了“编译”优化 # 比如 LOOP_SET_TO_ZERO replaces [-] # LOOP_MOVE_PTR for loops like
该表包含了需要计算的布尔表达式. operator 是枚举类型, 取值于('', '=') left_operand 和 right_operand 的值保证存在于 Variables 表单中...写一个 SQL 查询, 以计算表 Expressions 中的布尔表达式. 返回的结果表没有顺序要求. 查询结果格式如下例所示....-------------+----------+---------------+-------+ 如上所示, 你需要通过使用 Variables 表 来找到 Expressions 表中的每一个布尔表达式的值...or(l=r and operator='=') or(l-r<0 and operator='<') then 'true' else
函数式接口和lambda表达式优雅的替换大量的if-else 当面临大量的if-else语句时,很容易导致代码的复杂性和难以维护性增加。...幸运的是,在Java中,函数式接口和Lambda表达式等新特性可以帮助我们以一种更加优雅的方式替代这些if-else语句,从而使代码更简洁、可读性更高、易于扩展。...本文将探讨如何利用函数式接口和Lambda表达式来实现这一目标。 问题背景 在软件开发中,if-else语句通常用于根据不同的条件执行不同的操作。...if-else语句具有以下优势: 可读性:Lambda表达式的语法简洁明了,更容易阅读和理解,减少了代码的冗余。...总之,函数式接口和Lambda表达式为我们提供了一种更加优雅和灵活的方式来替代大量的if-else语句,使代码更易于管理和维护,同时提高了可读性和可扩展性。
实现思路是通过Antlr4来解析PromQL并修改。...现在开始编写解析PromQL并修改PromQL的代码: public class ParserUtil { public static String addLabels(String promQL....collect(Collectors.joining(",", "{", "}"))); } else....collect(Collectors.joining(","))); } } else...表达式是否正确 /** * 检查表示式是否正确 * * @param promql * @return */ public static boolean
概述PromQL (Prometheus Query Language) :PromQL是用于查询和分析监控指标数据的查询语言,广泛用于Prometheus监控系统。...PromQL 常用语句和语法:PromQL常用的语句包括基本查询、标签过滤、聚合、时间范围、数学运算和内置函数。...LogQL 常用语句和语法:LogQL常用的语句包括基本查询、关键字过滤、时间范围、聚合和正则表达式匹配。...language used for querying and analyzing log data, often used in conjunction with log aggregation tools like...used for querying and analyzing distributed tracing data, often used with distributed tracing tools like
这个 Metrics 属性的值遵守了 PromQL 规则。我们只要学会了 PromQL 表达式,就知道了怎么设置这个属性了。 什么是 PromQL?...正则匹配 PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。 正向匹配。使用 label=~regx 表示选择那些标签符合正则表达式定义的时间序列。 反向匹配。...除了使用m表示分钟以外,PromQL的时间范围选择器支持其它时间单位: s - 秒 m - 分钟 h - 小时 d - 天 w - 周 y - 年 时间位移操作 在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准...字符串 在 PromQL 中,字符串是一个简单的字符串值。直接使用字符串作为 PromQL 表达式,则会直接返回字符串。 ?...上图中我使用字符串 "this is a string" 直接作为 PromQL 查询表达式,结果返回的是一个字符串。
在日常开发过程当中,能把代码写出来,不一定就意味着能把代码写好,说不准,所写的代码在他人看来,其实就是一坨乱七八糟的翔,因此,代码简化尤其重要,我曾经遇到过这样一个类型的代码,即if-else里都有相同的...arrayStr.length; ++i) { 6 System.out.println("执行了正确的方法"); 7 } 8 } else...13 } 14 } 研究了一番后,发现jdk1.8有一个Lambda新特性,其实,这玩意很有用,若能熟悉它,可以减少很多的代码量,也能一定提高代码的性能,例如,我通过Lambda表达式将上面的代码简化这了这样...equals(status)) { 8 System.out.println("执行了正确的方法"); 9 } else
解析PromQL 目前对Prometheus 的promQL 的解析文章比较少,且Prometheus官方也没有提供一个公共的库来对齐进行解析。...下面实现对promQL的解析,并实现注入label功能。...源码定义在prometheus/promql/parser/lex.go // Aggregators....源码定义在Prometheus/promql/parser/function.go文件中, // Functions is a list of all functions supported by PromQL...Prometheus源码的eval函数(位于Prometheus/promql/engine.go文件中)对分别不同类型的promQL进行了处理,可以参考此处代码。
PromQL PromeQL是prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。...正则表表达式作为过滤条件 PromQL还可以支持使用正则表达式作为匹配条件,多个表达式之间使用| 进行分离: 使用 label=~regx 表示选择那些标签符合正则表达式定义的时间序列 反之使用label...~regx进行排除 注意 当我们使用正则表达式的时候,表达式里面必须指定一个能被完全匹配的值,和一个正则表达式; prometheus_http_requests_total{handler=~"/api...范围查询 直接通过类似于PromQL表达式prometheus_http_requests_total查询时间序列时,返回值中只会包含该时间序列中的最新的一个样本值,这样的返回结果我们称之为瞬时向量,而相应的这样的表达式称之为瞬时向量表达式...而我们如果想得到过去一段时间范围内的样本数据时,我们则需要使用区间向量表达式,区间向量表达式和瞬时向量表达式之间的差异在于区间向量表达式中我们需要定义时间选择的范围,是假范围通过时间范围选择器[] 来定义
eval.go 实现基本运算表达式(比如+, - 等)的执行。 funcs.go 实现PromQL内置函数(比如sum, min 等)的执行逻辑。...这个函数非常重要,因为它被PromQL解析器用来根据函数名称获取函数的详细信息,从而正确解析和处理查询表达式中的函数部分。...FuzzParseExpr:这个函数模糊测试PromQL中的表达式解析。它接收一个字节数组作为输入,将其解析成PromQL表达式。...Expr:表示一个表达式,可以是单独的表达式或者多个表达式的组合。 Expressions:表示一个表达式列表,用于存储多个表达式。...File: promql/parser/prettier.go 在 Prometheus 项目中,promql/parser/prettier.go 文件的作用是提供一个用于美化 PromQL 查询表达式的工具
Promql 一个Promql表达式可以计算为下面四种类型: 瞬时向量(Instant Vector) - 一组同样时间戳的时间序列(取自不同的时间序列,例如不同机器同一时间的CPU idle) 区间向量...等集合表达式,不过只能用在瞬时向量(Instant Vector)上面。...调用 promql.ParseExpr 由于Promql较为简单,所以Prometheus直接采用了LL语法分析。在这里直接给出上述Promql的AST树结构。...timeStamp ss.Points = append(ss.Points, Point{V: v, T: ts}) ev.currentSamples++ } else...总结 Promql是非常强大的,可以满足我们的各种需求。其运行原理自然也激起了笔者的好奇心,本篇文章虽然只分析了一条简单的Promql,但万变不离其宗,任何Promql都是类似的运行逻辑。
区间数据查询 使用 QUERY_RANGE API 我们则可以直接查询 PromQL 表达式在一段时间返回内的计算结果。...GET /api/v1/query_range URL 请求参数: query=: PromQL 表达式。 start=: 起始时间。 end=: 结束时间。 step=: 查询步长。...当使用 QUERY_RANGE API 查询 PromQL 表达式时,返回结果一定是一个区间向量: { "resultType": "matrix", "result": } 需要注意的是...,在 QUERY_RANGE API 中 PromQL 只能使用瞬时向量选择器类型的表达式。...例如使用以下表达式查询表达式 up 在 30 秒范围内以 15 秒为间隔计算 PromQL 表达式的结果。
区间数据查询使用 QUERY_RANGE API 我们则可以直接查询 PromQL 表达式在一段时间返回内的计算结果。...GET /api/v1/query_rangeURL 请求参数:query=: PromQL 表达式。start=: 起始时间。end=: 结束时间。step=: 查询步长。...当使用 QUERY_RANGE API 查询 PromQL 表达式时,返回结果一定是一个区间向量:{ "resultType": "matrix", "result": }需要注意的是...,在 QUERY_RANGE API 中 PromQL 只能使用瞬时向量选择器类型的表达式。...例如使用以下表达式查询表达式 up 在 30 秒范围内以 15 秒为间隔计算 PromQL 表达式的结果。
例如,下面的查询将返回一个Summary的值: my_summary{quantile="0.5"} 表达式语言数据类型 PromQL是Prometheus的查询语言,它支持多种数据类型。...在PromQL中,表达式是由函数、操作符、常量和变量组成的。...=: 选择不等于提供的字符串的标签(反向匹配) =~: 选择与提供的字符串进行正则表达式匹配的标签(正则表达式匹配) !...偏移量的时间表达式跟上面的选择器一样。...PromQL中的偏移量使用offset关键字进行定义,其语法格式为: offset //query_expression是查询表达式,duration
修改这里的json 再来说一下这个表达式,这个表达式也就是PromQL 语言。 Grafana Dashboard 中的表达式是 PromQL 语言,它是 Prometheus 的指标查询语言。...PromQL 表达式可以用于以下目的: 指标数据 指标数据 指标数据 标数据进行聚合 PromQL 表达式使用以下语法: [指标名] [操作符] [值] 例如,以下表达式将查询 CPU 使用率的指标数据...) 以下表达式将将 CPU 使用率的指标数据按主机聚合: by(host) cpu_usage PromQL 语言具有丰富的功能,可以满足各种监控需求。...以下是一些常用的 PromQL 表达式: 查询指标数据 cpu_usage 过滤指标数据 cpu_usage < 100 计算指标数据 avg(cpu_usage) 对指标数据进行聚合 by(host...) cpu_usage 如何简单调试PromQL,可以打开prometheus自带的web ui进入调试
PromQL 和 PromLens PromQL 现在已经发展成为基于时间序列的监控和报警的事实标准查询语言,虽然 PromQL 是一种强大的语言,允许灵活的计算,但它有一个陡峭的学习曲线,当基础数据的形状不被很好地理解时...PromLens 是一个 PromQL 查询生成器、分析器和解释器工具,帮助你学习和理解 PromQL,让你更有效、更自信地建立查询。...其次,PromLens 还通过显示你在查询中的每个表达式节点所处理的基础数据,帮助从初学者到专家级的用户快速建立和分析查询。...PromLens 的优势包括: 编辑:在输入表达式的同时,提供一流的自动提示、高亮显示和内联提示 可视化构建:能够使用基于表单的编辑器创建和修改 PromQL 查询 调试和修复:输入和 FIX 任何 PromQL...查询并将其所有子表达式可视化为一颗树 检测提示和操作:查看常见的查询模式和陷阱,以及警告提示和操作 PromLens 官方代码仓库:https://github.com/prometheus/promlens