前言
监控运维模块是区块链BaaS的核心模块之一,我们针对联盟链、主机和系统等多个监控对象提供丰富的监控指标。通过BaaS提供的综合监控大屏,用户可直观洞悉区块链业务全局,实现7*24小时监控全覆盖。
但随着BaaS业务的扩展,对监控运维模块提出了更高的挑战:
1)业务场景日趋丰富,监控对象的种类也在持续增长,这就导致BaaS平台需要不断地对不同监控对象进行适配,一定程度上浪费了大量研发资源;
2)区块链存在很多逻辑概念,例如联盟链、命名空间、通道等,因此每种概念都会落实到不同维度的监控指标,导致指标多维交错、逻辑复杂、指标死板且灵活性差;
3)通常市面上的平台提供的大屏指定了图标类型和展示方式,交付后企业运维人员往往无法自行变更监控图表及对象。
首创BaaS动态化监控系统
为彻底解决上述痛点,BaaS基于Prometheus协议研发了全新的动态化监控系统,实现三大关键能力的突破:
多维监控目标自动匹配能力。通过仪表盘模版标识,为用户自动匹配监控目标所属维度对应的监控指标,最大化覆盖业务端错综复杂的监控需求。
采集端灵活动态化能力。通过自研采集组件进行数据采集,具有数据规模更小、组件独立性更高、高可用等优势。同时,还支持动态库so的方式注入用户自定义采集逻辑,显著增强了运维能力和动态化能力。
动态化配置仪表盘能力。用户所需的个性化指标和个性化交互,均可以通过修改配置(查询语句+图表配置文件)直接呈现,无需修改代码。表盘支持多种图表格式并可对查询数据进行多种格式化处理,能够轻松进行仪表盘定制。
动态化监控平台架构设计
实践中,BaaS的动态化监控平台如何实现质的飞跃?让我们先看看新架构的实现:

可扩展数据采集模块
平台自研了数据采集器,自研采集器是基于Prometheus协议的数据采集组件,在宿主机上启动之后,能够伴随宿主机的生命周期,获取所在宿主机自身及所有进程的监控数据。
针对不同类型的宿主机平台提供不同的基础逻辑,采集器在安装之后会自动进行默认指标的采集,包含CPU、内存占用、带宽使用、磁盘分区等基础数据。除了默认的采集逻辑,采集器还支持注入自定义so动态库进行自定义数据的采集。当用户需要在基础采集逻辑之上新增自定义指标,如交易TPS、区块高度等数据时,只需根据自研采集器提供的标准实现一套自定义so(即自定义采集规则),在so中编写业务逻辑,采集器启动时即可进行采集指标的替换和新增,实现较强的扩展性。
自研采集器提供两种数据获取模式:
拉取模式下,BaaS会主动向采集器拉取监控数据;
推送模式下,采集器会定时向Prometheus推送监控数据,实现灵活的数据采集方式。
通过自研采集器,平台能够对多类型的资源主机进行管理,保证监控数据的完整性、实时性和准确性。
增强版查询引擎
针对 Prom-QL的代理查询引擎进行适配BaaS平台逻辑的兼容化改造,改造后支持在Prom-QL语句中增加变量。用户在编辑Prom-QL时可将指定的资源ID替换为变量,该变量将动态替换为后续真实创建的资源,无需用户手动填写,可极大地增强Prom-QL的灵活性。同时,查询引擎也可以根据变量增强Prom-QL的功能,如增加业务数据鉴权逻辑,以满足监控数据相关业务的权限控制需求。
自动化多维度匹配仪表盘
提供仪表盘编辑功能,企业管理用户可借助管理后台的仪表盘配置功能,结合企业实际运维需求,进行仪表盘的新建和编辑。平台已定义了丰富的metric指标,在编辑好特定的查询语句后,可选择不同的图表类型进行数据展示。更进一步地,支持对仪表盘中的图标进行大小、位置的自定义编辑。最终,查询语句、图标配置、仪表盘配置以及模版标识可统一保存为仪表盘模版,存在模版池中。
用户在查看目标资源的监控数据时,平台会解析目标资源的多维属性,自动在仪表盘模板池为用户寻找属性匹配度最高的仪表盘模板。模板匹配成功之后,代理查询引擎会将查询语句中的变量替换为对应资源的id,并使用组装后的查询语句进行数据查询,最后将数据结果呈现给用户。
动态化配置图表

图表是监控系统中最末端且最重要的环节。通过对不同类型的图表进行排列组织、对不同意义的数据进行标准化处理,不可读的数字将被转化成为可读性强、可视化程度高的数据。平台管理端提供仪表盘的图表编辑功能,用户不仅可以对仪表盘的展示结构如仪表盘图表位置、尺寸大小等进行灵活调整,还可以自定义编辑仪表盘中的图表,如进行修改查询语句、数据格式化类型等处理操作。
小结
相较于当前BaaS市场上普遍流行的监控中心,趣链新版动态化监控中心实现了真正的动态化,通过不同metric和不同图表类型的组合,可创造无限可能,显著降低适配成本,针对不同私有化、不同资源类型,只要按需配置图表即可满足用户诉求。
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210
我有一个ruby程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method
假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入
这里我想输出带有动态组名的json而不是单词组@tickets.eachdo|group,v|json.group{json.array!vdo|ticket|json.partial!'tickets/ticket',ticket:ticketend}end@ticket是这样的散列{a:[....],b:[.....]}我想要这样的输出{a:[.....],b:[....]} 最佳答案 感谢@AntarrByrd,这个问题有类似的答案:JBuilderdynamickeysformodelattributes使用上面的逻辑我已经