-
体验华为开发者空间鲲鹏系列案例,反馈改进建议,请直接在评论区反馈即可体验指导:案例中心
-
体验华为开发者空间,反馈改进建议,请直接在评论区反馈即可体验指导手册:cid:link_0
-
体验华为开发者空间,反馈改进建议,请直接在评论区反馈即可,体验指导手册:cid:link_0
-
😀Versatile-AI原生应用引擎作为一站式开发智能体的有力工具入驻华为开发者空间 开发平台-AI Agent支持广大开发者快速构建专属智能 AgentVersatile空间是通用型AI助手和领域专家Agent的智能协同工作空间,通过自主任务规划及多工具协同,实现复杂任务的智能化处理,从而提升工作效率。点击进入产品官网 了解更多点击快速跳转本期活动页面 了解案例共创活动为了让更多开发者能够更轻松、更高效地理解和使用我们的文档,进而提升云产品的整体使用体验,我们致力于进一步优化和完善官方产品文档。在此过程中,我们诚挚地邀请广大开发者积极参与,通过亲身体验云产品,编写实践案例或体验评测。一旦您的案例经过专家评审团的认可与采纳,将有以下三点:优质案例将被正式收录至官方案例库,供广大开发者学习。优质案例将选送到在华为云站内外10+个技术社区推荐,给予百万级流量资源。以上案例我们都将注明原作者名字,实现与开发者共创官方文档。参与者不仅有机会获得每月活动礼品,还有可能被评为年度内容贡献官,享受更多荣誉和奖励,获得更多合作机会。我们期待着与您一起,共同打造更加优质、高效的云服务体验。 参与投稿方式第1步:(已注册并实名可跳过)华为云账号实名认证,点击这里。(已设置可跳过)登录后设置社区昵称,点我设置。第2步:点击报名填写报名问卷,提供礼品发放地址等信息第3步:开启您的云端体验,分享实践案例,点我写帖子。版块选择“社区活动”分类选择“案例共创”帖子标题在前面添加【案例共创】(一定要加,方便识别参与活动的帖子)文末可添加活动名称及链接地址,如“我正在参加【案例共创】第5期 开发者空间 AI Agent 开发 cid:link_7”【如您在体验中有任何产品问题,欢迎在论坛发布问题求助帖(帖子分类选择问题求助)咨询产品专家,如发现任何体验不友好、产品Bug、文档页面错漏等情况,欢迎通过云声平台反馈给我们,还有机会领取云声专属礼品!活动相关咨询可以论坛私信“论坛小助手SUN”】 本期投稿内容:围绕如下主题之一发表文章/视频Ø 华为云产品介绍:华为开发者空间AI Agent:AI原生应用引擎提供企了包括数据准备、模型选择/调优、知识工程、模型编排、应用部署、应用集成等能力,降低智能应用开发门槛、提升开发效率。华为开发者空间的AI Agent集成Versatile空间,Versatile空间是通用型AI助手和领域专家Agent的智能协同工作空间,通过自主任务规划及多工具协同,实现复杂任务的智能化处理,从而提升工作效率。领取链接:cid:link_2AI Agent页面操作文档:cid:link_1云函数页面操作文档:cid:link_0Ø 应用构建要求开发者可结合自己的工作实践,须在华为开发者空间内完成应用构建,应用构建类型和主题参考如下:AI Agent应用开发 主题场景包括但不限于以下方向(仅做参考):使用AI Agent进行专业领域知识库构建(进行组织、存储及管理知识);咨询快捷助手(推荐助手等);工作流规划规划(使用工作流规划行程等);案例模版参考:1. AI Agent应用开发:- 1)案例地址:cid:link_4简介:使用开发者空间开发平台,通过开发平台AI原生应用引擎中提供的MCP资产和预置的的大模型,快速便捷地完成饮食推荐和12306车票助手Agent的构建和发布。- 2)案例地址:cid:link_5简介:使用华为开发者空间-开发平台,通过开发平台提供的云函数、AI Agent能力实现We码会议助手从MCP Server部署到创建AI会议Agent,再到发布使用AI 会议Agent,最后在浏览器中操作使用该AI会议Agent。注意:文章类请大家一定要按照案例模版的格式进行编写注意:文章类请大家一定要按照案例模版的格式进行编写注意:文章类请大家一定要按照案例模版的格式进行编写Ø 投稿规则文章投稿要求:1)构建的应用需要完成发布,有应用在线截图。2)案例场景和方案以及用到的华为云产品或者开源框架简述。3)开发过程实际操作描述(文字描述+截图+代码)。4)案例实操需要完整体现,读者可根据案例上手并体验。 视频投稿要求:1)以华为开发者空间最佳实践操作为主题,介绍实操方式、技术心得等技术内容。2)视频时长≥60S、播放量≥100(发布平台不限),视频发布需@华为云开发者联盟官方账号,带话题#华为开发者空间#。3)视频发布后,请将视频链接回复在本活动贴评论区,或私信“技术火炬手”。 活动流程(全年征集,每月一期评选)投稿时间:2025年7月1日-7月31日联合评审:2025年8月1日-8月9日奖项公示:2025年8月10-11日奖品发放:获奖名单公布后5个工作日内寄出 评奖规则届时将有华为技术专家团参与评审,主要按照以下维度评分:标准类型分值释义分值阶梯总分值操作完整性关键节点以文字+截图的形势进行说明1:空间的实践操作,而非方案类描述2:参考官方提供模版,可读性好,有关键节点文字说明与截图3:符合2的条件下能够突出关键代码释义以及关键步骤解释说明4:应用构建后可执行,并有执行后效果介绍和展示1-4/0.5梯度4案例实用性贴近实际行业生产或者业务场景1:纯技术应用不涉及实际应用场景,比如接入模型后的问答助手2:基于实际应用场景具有一定的实用性3:基于实际场景且在开发者空间完成部署实施4:基于实际应用场景解决行业的痛点问题,可用于生产实施1-4/0.5梯度4技术多样性案例中应用更多的华为云技术或主流开源框架1:使用活动中要求的空间以及工具或者技术2:基于空间结合更多的华为云技术/服务、开源框架或技术1-2/0.5梯度2视频类评分规则:视频大于1分钟不超过10分钟,进行内容解说、技术分享等干货输出;视频内容制作精良,技术演示深入浅出,有趣有料有观点;视频播放量、转赞评藏等互动量作为加分项。荣誉与奖励1、获奖案例将有机会作为华为云开发者空间应用的标杆案例,进行录入成册推广宣传,并发布到华为云开发者联盟公众号传播矩阵。同时,案例内容可作为后续作者申请评选HCDE的相关贡献内容。标杆案例:【华为开发者空间 · 案例共创故事(郑州轻工业大学)】(https://mp.weixin.qq.com/s/pPmPcdlWYLPalzJPqxIfew) Ø 奖项设置文章案例奖项:视频案例奖项:一等奖1个,1000元实物,华为sound joy 音箱; 二等奖3个,华为6i耳机;三等奖10个,礼品+代金券注:每期评审专家根据每篇文章评选文章分数及等级,每期文章质量不一,不排除有某个奖项轮空的情况,如第X期文章质量在A级和B级,即S和S+级轮空。代金券及周边礼物发放对象为:已完成实名认证的华为云用户。发放到填写报名问卷的账号及收货地址中,礼包类礼品均为实物礼品。重要说明1、投稿内容一经采用,将会被纳入官方产品文档,文章作者拥有著作权,华为云拥有使用权、修改权等。2、每期评审专家根据每篇文章评选文章分数及等级,每期文章质量不一,不排除有某个奖项轮空的情况,如第X期文章质量在A级和B级,即S和S+级轮空3、投稿内容字数不少于500字(不含代码),要求思路清晰、文字顺通、图片清晰、代码规范,不得有打广告、加二维码引流和凑字数行为。4、文章要求发布在华为云开发者社区论坛,允许搬运自己发在其他平台的文章,但仅支持搬运自己的原创文章,搬运他人的文章当抄袭处理。内容必须保证内容原创性,实践过程真实、内容代码化,如发现投稿内容为转载、复制、抄袭、恶意拼接、灌水等侵权作弊行为,均视为无效并取消参与资格5、将发表过的文章删除后重新发表的文章,不计入发文数量,以文章评选时在线显示数量为准。活动期间,如有用脚本刷阅读量、注册僵尸号刷赞等严重违反社区规范的行为,直接取消所有获奖资格。6、审核通过被采纳的文章作者,将在下月初进行获奖名单公布和奖励发放,届时会有站内信通知,请及时关注并填写快递信息,过期未核对或填写视为放弃该期奖品。7、对于持续输出高质量内容的作者,每年度末还有年度贡献大礼包送上。特别声明:华为云有权根据自身运营安排,自主决定和调整本活动的具体规则,具体活动规则以活动页公布规则为准。相关规则一经公布即产生效力,您应当予以遵守。如您不认同以上规则,请谨慎参与本次活动。
-
CNN(卷积神经网络)在深度学习图像处理任务中的核心地位源于其独特的仿生架构设计,该设计针对图像数据的空间特性进行了优化,使其在特征提取、计算效率和泛化能力上显著超越传统方法。 一、核心原理——仿生机制与结构设计局部感知与权重共享局部感知:CNN通过卷积核(如3×3或5×5)在图像局部区域滑动(感受野),提取边缘、纹理等基础特征,模拟生物视觉神经元对局部刺激的响应。权重共享:同一卷积核在整个图像上复用,大幅减少参数量。例如,处理1000×1000像素图像时,全连接网络需10⁶×10⁶参数,而CNN仅需k²×c(k为核尺寸,c为通道数),参数量降低90%以上。分层特征抽象层级结构:低层卷积提取边缘/角点,中层组合为纹理/部件,高层整合为物体整体语义,形成“边缘→部件→物体”的递进式抽象。池化操作:最大池化保留显著特征并降维,增强平移不变性(物体位置变化不影响识别)。端到端学习直接从原始像素学习特征,无需人工设计特征(如SIFT、HOG),避免特征工程偏差,适应复杂场景(遮挡、光照变化)。 二、性能的优势——效率与鲁棒性计算高效性卷积操作高度并行化,适合GPU加速,训练速度比传统方法快10倍以上。池化层压缩特征图尺寸(如尺寸减半),减少后续计算量。空间不变性平移不变性:权重共享使相同特征在不同位置被同等识别。尺度与旋转鲁棒性:通过数据增强(缩放、旋转)或结构设计(如空间金字塔池化)提升适应性。抗过拟合能力Dropout随机失活神经元、L2正则化约束权重,抑制复杂模型过拟合。批标准化(BatchNorm)稳定训练过程,加速收敛。 三、实际中的应用经典模型创新AlexNet:首次引入ReLU和Dropout,ImageNet分类错误率降至16.4%(2012年)。ResNet:残差连接解决梯度消失,支持千层网络,错误率低至3.57%。轻量化设计:MobileNet采用深度可分离卷积,参数量减少90%,适配移动端。跨领域应用扩展任务类型应用场景代表模型图像分类ImageNet竞赛VGG, EfficientNet目标检测自动驾驶、安防YOLO, Faster R-CNN语义分割医学影像(肿瘤识别)U-Net, FCN跨模态任务图文匹配(CLIP)ViT-CNN混合架构 四、挑战和优化的方向点数据依赖性强需大量标注数据,可通过迁移学习(如ImageNet预训练)缓解小样本问题。变形敏感性对旋转、扭曲敏感,解决方案包括:空间变换网络(STN)学习几何不变性;弹性形变数据增强。可解释性不足梯度类激活图(Grad-CAM)可视化卷积层关注区域,辅助诊断决策依据。一些小总结:CNN的核心竞争力特性传统方法CNN优势效果特征提取人工设计(如HOG)自动分层学习适应复杂场景,精度提升30%+参数效率高维全连接,参数量爆炸局部连接+权重共享参数量减少90%计算效率CPU串行计算慢GPU并行卷积加速训练速度提升10倍不变性需额外增强内置平移/尺度鲁棒性减少预处理依赖CNN通过仿生局部感知、参数共享、层级抽象三大机制,高效解决图像数据的空间相关性、高维度、语义复杂性问题,成为计算机视觉不可替代的基石。未来趋势是与注意力机制(如Transformer)融合,兼顾局部细节与全局建模。
-
全连接层(Fully Connected Layer, FC)是卷积神经网络(CNN)中的关键组件,通常位于网络末端,负责将卷积层和池化层提取的局部特征整合为全局特征,并完成分类或回归任务。 一、核心作用与功能特征整合与全局表示卷积层和池化层提取的是图像的局部特征(如边缘、纹理),而全连接层通过密集连接将这些分散的局部特征整合为全局特征,形成对物体整体的高级语义理解(例如将“眼睛”“鼻子”等局部特征组合成“人脸”的整体概念)。空间不变性:通过整合不同位置的特征,减少物体平移对分类结果的影响,提升模型鲁棒性。分类与决策全连接层作为分类器,将整合后的特征映射到样本标记空间。例如:在图像分类任务中,通过 Softmax 激活函数输出每个类别的概率(如猫:0.92,狗:0.05)。在回归任务中(如房价预测),直接输出连续值。非线性建模通过激活函数(如 ReLU、Sigmoid)引入非线性变换,使网络能够拟合复杂的数据分布,增强表达能力。 二、结构与工作原理密集连接机制每个神经元与前一层的所有神经元相连,形成权重矩阵 W 和偏置向量 b。输出计算为:y = \sigma(Wx + b),其中 \sigma 为激活函数。参数规模:若输入向量长度为 n,输出为 m,则参数量为 n \times m + m(例如输入1000维、输出500维时,参数约50.5万个)。输入处理:特征扁平化(Flatten)卷积层输出的特征图为三维张量(高度×宽度×通道数),全连接层需先将其展平为一维向量(如 64 \times 7 \times 7 \rightarrow 3136 维)。层级堆叠与特征抽象多层全连接可逐步抽象特征:第一层:整合基础局部特征(如“眼睛”“耳朵”);第二层:组合为高级特征(如“猫头”);输出层:生成全局决策(如“猫”)。三、挑战与优化策略参数量大导致过拟合全连接层参数常占CNN总参数的80%以上,易在小数据集上过拟合。解决方案:正则化:添加L1/L2惩罚项约束权重;Dropout:训练中随机丢弃部分神经元(如丢弃率0.5);批标准化(BatchNorm):加速训练并稳定梯度。替代方案:减少参数依赖全局平均池化(GAP):直接对每个特征图取平均值,输出类别数相同的向量(如ResNet),参数量接近于零。1×1卷积:替代全连接层实现通道降维(如Inception网络),保留空间信息的同时减少计算量。 四、全连接层 vs. 其他层特性卷积层/池化层全连接层连接方式局部连接(感受野受限)全局密集连接参数共享是(卷积核滑动复用)否(每个连接独立权重)空间信息处理保留空间结构(二维特征图)破坏空间结构(一维向量)核心作用局部特征提取与降维全局特征整合与分类决策 五、总结核心价值:全连接层是CNN实现端到端学习的关键,将局部特征升维至全局语义,完成最终决策。适用场景:传统CNN末尾(如AlexNet、VGG),但现代网络(如ResNet、Inception)逐渐用GAP或1×1卷积替代以减少参数。设计建议:小数据集优先使用 Dropout + 正则化 抑制过拟合;深层网络可尝试 GAP 替代全连接层;分类任务末尾需结合 Softmax 输出概率分布。通过理解其“特征整合-决策”的双重角色,可更灵活设计CNN架构,平衡性能与效率。实际应用中,需根据数据规模与任务复杂度选择全连接层或其替代方案。
-
卷积神经网络(CNN)相比传统机器学习方法在图像和空间数据处理中具有显著优势 1. 自动特征提取能力传统方法:依赖人工设计特征(如SIFT、HOG或颜色直方图),需专业领域知识且特征泛化性差。CNN:通过卷积层自动学习图像中的局部特征(如边缘、纹理、形状),无需人工干预。例如:低层卷积核识别简单边缘和角点。高层卷积核组合基础特征,形成复杂语义(如物体部件)。优势:适应复杂数据(如遮挡、光照变化),提升模型泛化能力。 2. 参数效率与计算优化局部连接与权重共享:传统全连接网络(如MLP)需每个神经元连接所有输入像素,参数量巨大(如1000×1000像素图像需1亿参数)。CNN通过卷积核局部滑动和参数复用,大幅减少参数。例如:3×3卷积核仅需9个权重,与输入尺寸无关。池化层(Pooling):压缩特征图尺寸(如最大池化保留显著特征),降低计算量并增强平移不变性。 3. 空间不变性与分层特征学习平移不变性:卷积核在不同位置重复使用,使模型对物体位置变化不敏感(如猫在图像左侧或右侧均能识别)。层次化特征抽象:底层:提取基础视觉特征(边缘、颜色)。中层:组合为纹理或部件(如车轮、车窗)。高层:整合为完整物体(如汽车)。与传统方法对比:传统算法(如SVM、随机森林)无法建模这种层级结构,导致复杂场景识别能力弱。 4. 性能优势与硬件适配性计算效率:卷积操作高度并行化,适合GPU加速,训练速度远超传统方法。实验表现:在Fashion MNIST数据集上,CNN准确率达89%,显著高于逻辑回归(80%)、随机森林(77%)和SVM(77%)。大规模任务(如ImageNet)中,CNN模型(ResNet、EfficientNet)Top-5错误率降至5%以下,远超传统方法。 5. 应用场景的广泛性与灵活性图像相关任务:图像分类(如AlexNet、VGG)。目标检测(YOLO、Mask R-CNN)。图像分割(U-Net)。跨领域扩展:自然语言处理(文本分类、情感分析)。视频分析(动作识别)。医学影像(病灶检测)。传统方法局限:依赖固定特征工程,难以适应多模态或高维数据。 局限性及应对策略虽然CNN优势显著,但仍需注意:数据依赖性:需大量标注数据,可通过数据增强(旋转、裁剪)或迁移学习缓解。旋转与尺度敏感性:对物体旋转和缩放变化较敏感,可通过空间变换网络(STN)改进。计算资源需求:轻量化设计(如MobileNet)可适配移动端部署。总结:核心优势对比特性传统机器学习方法卷积神经网络(CNN)特征提取方式依赖人工设计特征自动学习层级特征参数效率参数量巨大,扩展性差权重共享,参数少且高效空间不变性需额外处理(如数据增强)内置平移不变性计算适配性并行优化困难高度并行化,GPU加速优势明显复杂任务表现高维数据(如图像)表现弱在图像、视频等任务中领先CNN通过端到端学习、参数共享和分层抽象机制,解决了传统方法在高维数据上的瓶颈,成为计算机视觉领域的核心工具,并持续推动跨领域应用创新。
-
在训练卷积神经网络(CNN)时,学习率(Learning Rate, LR)是影响模型性能的核心超参数之一。它决定了参数更新的步长:过大会导致模型震荡、不收敛;过小则会使训练缓慢、陷入局部最优。合理调节学习率能显著加速收敛、提高模型精度。以下是具体的调节策略和实践技巧:一、学习率的核心作用与影响学习率通过优化器(如SGD、Adam)控制参数更新幅度:参数更新公式:是损失函数的梯度。影响:过⼤LR:参数更新步长过大,可能跳过最优解,导致损失震荡甚至发散(Loss上升)。过⼩LR:参数更新缓慢,训练耗时增加,易陷入局部极小值(验证集精度停滞)。二、基础调节策略:学习率调度(Learning Rate Scheduling)实际训练中,固定学习率难以兼顾“快速收敛”和“精细优化”,通常采用动态调整策略(学习率调度),根据训练进程(如epoch数、损失变化)自动调整LR。1. 阶段性衰减(Step Decay)原理:预设训练阶段,每经过一定epoch后按固定比例降低学习率(如每10个epoch衰减为原来的1/10)。适用场景:训练初期需要较大LR快速收敛,后期减小LR精细优化。示例:初始LR=0.01,每15个epoch乘以0.1(即0.01→0.001→0.0001…)。实现(PyTorch):import torch.optim as optim from torch.optim.lr_scheduler import StepLR optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # 每15个epoch,学习率乘以0.1 scheduler = StepLR(optimizer, step_size=15, gamma=0.1) for epoch in range(100): train(...) scheduler.step() # 每个epoch后更新学习率 2. 指数衰减(Exponential Decay)原理:学习率随epoch呈指数级衰减,公式为。特点:衰减速度比阶段性衰减更平滑,适合需要缓慢精细调整的场景(如训练后期)。注意:( \gamma )需接近1(如0.95~0.99),否则LR会快速趋近于0导致训练停滞。3. 余弦退火(Cosine Annealing)原理:学习率随epoch按余弦函数曲线衰减,公式为:其中( T_{\text{max}} )为衰减周期,( \text{LR}_{\text{min}} )为最小学习率。特点:后期LR缓慢下降,避免陷入局部最优,尤其适合深层CNN(如ResNet、DenseNet)。扩展:带重启的余弦退火(Cosine Annealing with Restarts),定期将LR重置为较大值,帮助模型跳出局部最优(适合复杂任务)。4. 自适应衰减(ReduceLROnPlateau)原理:当验证集指标(如损失、准确率)停止提升时,自动降低学习率(如当验证损失连续3个epoch不下降时,LR乘以0.5)。优点:无需预设衰减时机,完全基于训练动态调整,适合数据分布复杂、难以预判衰减点的场景。实现(PyTorch):scheduler = optim.lr_scheduler.ReduceLROnPlateau( optimizer, mode='min', # 监控"最小化验证损失" factor=0.5, # 衰减系数 patience=3, # 连续3个epoch无改善则衰减 verbose=True ) for epoch in range(100): train_loss = train(...) val_loss = validate(...) scheduler.step(val_loss) # 基于验证损失更新LR 三、自适应学习率优化器除了手动调度,还可使用自带学习率调整机制的优化器,它们会根据梯度的历史信息动态调整每个参数的学习率,适合难以手动调参的场景。优化器特点适用场景Adam结合动量和RMSProp,对学习率敏感低,收敛快数据少、训练初期快速收敛RMSprop自适应调整学习率,抑制梯度震荡,适合非平稳目标函数递归神经网络(如CNN+LSTM)AdamWAdam的改进版,加入权重衰减(Weight Decay),泛化能力更强深层CNN(如ViT、ResNet-50+)注意:自适应优化器仍需设置初始学习率(如Adam通常用0.001),且可结合学习率调度(如余弦退火)进一步提升性能。四、学习率初始化:找到合适的起点初始学习率设置不当会导致训练失败(如发散),可通过以下方法确定初始值:1. 经验值参考简单CNN(如LeNet、小型自定义网络):SGD用0.01~0.1,Adam用0.001~0.0001。深层CNN(如ResNet、VGG):SGD用0.1(配合动量0.9),Adam用0.0001~0.0005。预训练模型微调:初始LR需更小(如0.0001),避免破坏预训练权重。2. 学习率范围测试(LR Range Test)通过逐步增大学习率,观察损失变化,找到“最大有效学习率”:从极小LR(如1e-7)开始,每个batch按指数级增大LR(如乘以1.1)。绘制“学习率-损失”曲线,选择损失开始快速下降且未发散的LR作为初始值(通常是曲线最低点LR的1/10)。工具:FastAI库的lr_find()函数可自动实现该测试。五、训练阶段的动态调整技巧预热(Warmup):训练初期用小LR(如初始值的1/10),逐渐增加到目标LR(如前5个epoch线性升温)。作用:避免初始大LR破坏参数分布(尤其对批归一化(BN)层,初期统计量不稳定)。适用场景:大batch训练(如1024+)、深层CNN(如EfficientNet)。分段调整:训练前期(0~50% epoch):用较大LR快速收敛(如0.01)。中期(50%~80% epoch):减小LR(如0.001),精细优化。后期(80%~100% epoch):用极小LR(如0.0001),微调参数至最优。六、诊断与调优:通过损失曲线判断学习率是否合适训练过程中,可通过损失曲线(训练/验证损失)判断学习率是否合理:现象可能原因解决方案损失持续上升(发散)初始LR过大降低初始LR(如除以10)损失下降极慢,长期不变LR过小或陷入局部最优增大LR或用余弦退火重启训练损失低但验证损失高(过拟合)LR过大导致参数过拟合减小LR+增加正则化(如Dropout)损失震荡剧烈(忽高忽低)LR过大或batch size过小降低LR或增大batch size七、总结:调节学习率的核心原则动态性:避免固定LR,结合调度策略(如分段衰减、余弦退火)或自适应优化器。阶段性:初期用较大LR快速收敛,后期用小LR精细优化,必要时预热。数据驱动:通过损失曲线、LR范围测试等工具,而非完全依赖经验。协同优化:学习率需与batch size、正则化(如权重衰减)、优化器动量等参数协同调整(如增大batch size时,LR可适当增大)。通过以上策略,可有效提升CNN的训练效率和最终性能。实际应用中需结合具体任务(如分类、检测)和数据特点,通过多次实验迭代优化。
-
一、自动化工具辅助迁移SQLShift:异构存储过程智能转换核心能力:SQL Server → GaussDB:支持 T-SQL 到 PL/pgSQL 的精准转换,覆盖 300+ 语法点(如临时表、系统函数、数据类型)。示例:SELECT ... INTO #temp → CREATE TEMP TABLE ... AS非标语法修复:自动重构表别名作用域(如 UPDATE a SET ... FROM tableA a → UPDATE tableA a SET ...)。Oracle → GaussDB:通过 PL/SQL 到 PL/pgSQL 转换(需间接利用 PostgreSQL 兼容性),支持函数定义、事务控制等重构。批量处理:单次支持上百个存储过程转换,自动识别兼容性风险并生成报告。华为 DRS(Data Replication Service):负责数据全量+增量迁移,但不处理存储过程逻辑,需与 SQLShift 配合使用。支持实时同步期间的业务验证,减少停机时间。 二、手动调整与适配关键点即使使用工具,仍需人工干预以下场景:语法差异深度适配:Oracle 特有语法:ROWNUM → ROW_NUMBER() OVER()CONNECT BY → WITH RECURSIVESQL Server 特性:@@IDENTITY → LASTVAL()游标逻辑需改写为 GaussDB 的 FOR ... IN 循环。函数与错误处理重构:函数替换:SYSDATE → CURRENT_TIMESTAMP,NVL() → COALESCE()。异常处理:Oracle 的 PRAGMA EXCEPTION_INIT 需转为 GaussDB 的 EXCEPTION WHEN ... 块。分布式事务优化:GaussDB 的分布式架构需避免跨节点事务锁竞争,例如将 SELECT ... FOR UPDATE 替换为 SKIP LOCKED。手动适配关键语法:-- Oracle PL/SQL → GaussDB SQL示例 -- 1. 游标处理 -- Oracle DECLARE CURSOR c_emp IS SELECT empno, ename FROM emp; v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_empno, v_ename; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename); END LOOP; CLOSE c_emp; END; -- GaussDB适配 DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT empno, ename FROM emp LOOP RAISE INFO '% %', rec.empno, rec.ename; END LOOP; END $$; -- 2. 异常处理 -- Oracle BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = 7369; IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20001, '员工不存在'); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误: ' || SQLERRM); END; -- GaussDB适配 DO $$ BEGIN UPDATE emp SET sal = sal * 1.1 WHERE empno = 7369; IF NOT FOUND THEN RAISE EXCEPTION '员工不存在'; END IF; EXCEPTION WHEN OTHERS THEN RAISE INFO '错误: %', SQLERRM; END $$; 三、迁移全流程最佳实践评估与规划:兼容性扫描:使用 SQLShift 预检存储过程,标记不兼容对象(如示例中 SP_TSA_WAR 被标记为不兼容)。首先需要评估现有存储过程的迁移难度,识别兼容性问题: #存储过程语法差异分析工具(伪代码) def analyze_procedures(source_db_type, procedure_files): compatibility_map = { 'oracle': { 'plsql_syntax': ['ROWNUM', 'START WITH CONNECT BY', 'PACKAGE BODY'], 'functions': ['TO_CHAR', 'NVL', 'DECODE'], 'datatypes': ['NUMBER', 'VARCHAR2', 'DATE'] }, 'sqlserver': { 't_sql_syntax': ['BEGIN TRANSACTION', 'RAISERROR', '@@ROWCOUNT'], 'functions': ['GETDATE()', 'ISNULL', 'LEN'], 'datatypes': ['INT', 'VARCHAR', 'DATETIME'] } } issues = [] for file in procedure_files: content = open(file, 'r').read() for feature, patterns in compatibility_map[source_db_type].items(): for pattern in patterns: if pattern in content: issues.append(f"发现不兼容语法:{pattern}") return issues issues = analyze_procedures('oracle', ['procedure1.sql', 'procedure2.sql']) print(issues)关键差异点包括:语法差异:PL/SQL vs. SQL Server T-SQL vs. GaussDB SQL数据类型映射:如NUMBER→DECIMAL,VARCHAR2→VARCHAR函数替换:如TO_DATE→TO_TIMESTAMP系统变量:如ROWNUM→ROW_NUMBER()事务处理:如COMMIT WORK→COMMIT版本适配:明确 GaussDB 版本限制(如 V2.0-3.x 不支持 uuid_generate_v4())。分阶段迁移:建议采用 "先数据后逻辑" 的策略:数据模型迁移使用 GaussDB Migration Toolkit 进行表结构迁移处理外键、索引、约束的差异存储过程转换优先迁移基础功能的存储过程采用 "翻译 + 适配" 的方式处理复杂逻辑增量迁移验证灰度发布部分业务,对比迁移前后结果使用数据比对工具验证数据一致性 测试与验证:数据一致性:通过 DRS 校验全表记录数及关键字段抽样。性能压测:使用 TPC-C/TPC-H 对比迁移前后 TPS 及响应延迟。使用 Git 管理存储过程代码,建立版本控制编写自动化测试脚本,确保每次变更的质量设计回滚方案,在出现问题时能快速恢复# 自动化测试脚本 #!/bin/bash # 1. 执行迁移脚本 psql -U username -d dbname -f migrate_procedures.sql # 2. 运行测试用例 psql -U username -d dbname -f test_cases.sql > test_results.txt # 3. 检查测试结果 if grep -q "FAILED" test_results.txt; then echo "测试失败,开始回滚..." psql -U username -d dbname -f rollback_script.sql exit 1 else echo "所有测试通过" exit 0 fi 四、常见风险与规避策略临时表堆积:工具自动将 ON COMMIT DROP 重构为显式清理链(DELETE ROWS + DROP),避免内存溢出。业务逻辑断裂:如 SQL Server 的 NEWID() 无直接等价函数时,工具建议重构为应用层生成 UUID。事务中断:自动标记需外部控制的 COMMIT 语句,防止存储过程内提交导致连接终止。 总结优先使用 SQLShift 实现 70%-90% 的自动化转换,结合 DRS 保障数据同步。人工重点攻关:分布式事务、递归查询、非标函数等复杂逻辑。分阶段验证:从非核心业务到关键系统逐步推进,通过灰度发布控制风险。参考 华为 DRS 迁移指南 部署数据同步。
-
1、场景说明客户已有CMDB系统管理云内外资源,需要将HCS的资源也统一纳管管理,ManageOne提供北向接口可以查询HCS相关资源数据,客户获取数据后看匹配到自己CMDB系统的模型和字段,完成数据录入 2、使用流程ManageOne资源管理系统为各种资源进行建模,包括为物理实体建立了物理资源模型,以及建立在物理资源模型上进行抽象形成的逻辑资源模型。资源模型主要分为两大类:系统资源、租户资源:1) 系统资源主要包含: 1.物理设备(如服务器、存储、网络设备等) 2.管理节点虚拟机(如ManageOne、云服务节点等,区别于租户申请的虚拟机) 3.虚拟化物理主机(宿主机) 4.逻辑位置 5.上述物理资源间的关系2) 租户资源主要包含: 1.租户侧的组织结构(包含各级VDC、用户、project信息) 2.租户申请的计算、存储、网络等资源 3.上述租户资源间的关系 文档说明:1. 《ManageOne运维面API参考》2. 《ManageOne 租户资源北向模型》3. 《ManageOne 系统资源北向模型》(注:从8.1.0版本起,文档2、3合并为《ManageOne资源北向模型》)ManageOne北向API参考文档各版本汇总获取:cid:link_0 接口说明:1.接口和参数:系统资源和租户资源及其对应的关系模型分别需要使用不同接口来查询,一共涉及到4个接口。接口参数需查询文档。如下表所示。2.资源模型:1中接口参数class-name或relation-name的值需参考文档《ManageOne 系统/租户资源北向模型》,参考下表。序号接口含义接口URL路径参数说明1查询租户资源模型或视图GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/{class-name}class-name:CI类名,参考《ManageOne 租户资源北向模型》中前缀为“CLOUD、TENANT、V”的资源。2查询租户资源关系模型GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/relations/{relation-name}relation-name:关系类名,参考《ManageOne 租户资源北向模型》中前缀为“R”的资源。3查询系统资源模型GET https://{OC北向接口域名}/rest/cmdb/v1/instances/{className}class-name:CI类名,参考《ManageOne 系统资源北向模型》中前缀为“SYS”的资源。4查询系统资源关系模型GET https://{OC北向接口域名}/rest/cmdb/v1/instances/relations/{relationName}relationName:关系类名,参考《ManageOne 系统资源北向模型》中前缀为“M”的资源。备注:OC北向接口域名非xx.xx.xx.xx:31943,获取方法请参考cid:link_3请求头:(token的获取方法请参考cid:link_1)Accept:application/json Content-Type:application/json;charset=UTF-8X-Auth-Token:xxxxxxxxxxxx查询参数:(4个接口通用)参数说明pageNo页码,默认值:1,取值范围:1~65535。非必选。pageSize页大小,默认值20。取值范围:1~1000。非必选。contentSelector要返回的字段,默认返回所有字段,格式:["attr1","attr2"]。非必选。orderBy排序方式,格式:[{"field":"attr1","asc":true}]。非必选。condition查询条件,受Http Header最大81920字符限制。条件示例:{"constraint":[{"simple":{"name":"incharger","value":"ManageOne","operator":"equal"}},{"logOp":"and","simple":{"caseSensitive":false,"name":"name","value":"B080-Cabinet01","operator":"equal"}}]}。字段说明:Condition(关键字),Constraint(关键字),Simple(关键字),logOp(条件连接符,可取的值有"and","or"),name(资源的属性名称),value(属性值),operator(运算符,可取的值有"equal","not equal","contain","not contain","in","not in","is null","not null"等)。条件说明:{"simple":{"name":"incharger","value":"ManageOne","operator":"equal"}}表示incharger="ManageOne"。{"logOp":"and","simple":{"caseSensitive":false,"name":"name","value":"B080-Cabinet01","operator":"equal"}}表示name="B080-Cabinet01",加上"caseSensitive":false则表示属性值"B080-Cabinet01"不区分大小写,"logOp":"and"表示这个查询条件与上一个条件是and关系。注:查询关系时(表中第2、4个链接),不需要加最外层的{"constraint":xxxx}。如:[{"simple":{"name":"source_Instance_Id","value":"C726DF8E2E8446FDA17D6D3B7C495DFF","operator":"equal"}}] 常用查询:注:以下接口的响应体请参考文档《ManageOne 租户/系统资源北向模型.xlsx》。租户资源(IaaS)弹性云服务器(ECS)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_VM裸金属服务器(BMS)(BMS实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_BMS(BMS节点)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_BMS_NODE弹性IP(EIP)(EIP实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_EIP(带宽)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_BANDWIDTHS弹性云硬盘(EVS)(EVS实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_VOLUME(快照)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_SNAPSHOT(备份)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_BACKUP镜像(IMS)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_IMAGE路由/VPCGET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_ROUTER网络GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_NETWORK子网GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_SUBNET端口/网卡(PORT)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_PORT安全组(SG)(条件不可省略)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_SECURITY_GROUP?condition={"constraint":[{"simple":{"name":"regionId","value":"C4CA4238A0B933828DCC509A6F75849B","operator":"equal"}}]}(安全组规则,条件不可省略)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_SECURITY_GROUP_RULE?condition={"constraint":[{"simple":{"name":"regionId","value":"C4CA4238A0B933828DCC509A6F75849B","operator":"equal"}}]}弹性负载均衡器(ELB)(ELB实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_ELB(监听器)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_LISTENER虚拟防火墙/网络ACL/vFW(vFW实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_VFW(vFW策略)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_VFW_POLICY(vFW规则)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_VFW_RULE租户资源(PaaS)关系型数据库(RDS)(RDS实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_RDS_INSTANCE(RDS节点)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_RDS_NODE云容器引擎(CCE)(CCE集群)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_CCE_CLUSTER(CCE节点)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_CCE_NODE(CCE容器)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_CCE_CONTAINER云数据库 GaussDB(for openGauss、mysql)(数据库实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_RDS_INSTANCE(数据库节点)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_RDS_NODE文档型数据库(DDS)(DDS实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DDS_INSTANCE(DDS节点)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DDS_NODE数据复制服务(DRS)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DRS_INSTANCE分布式数据库中间件(DDM)(DDM实例)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DDM_INSTANCE(DDM节点)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DDM_NODE应用与数据集成平台(ROMA)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_ROMA_CONNECT_INSTANCE应用管理与运维平台(CSE/ServiceStage)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_CSE_ENGINES数据湖治理中心(DGC)(云数据迁移)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DAYU_CDM_CLUSTER(数据服务)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DAYU_DLM_GATEWAY(数据湖治理中心)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DAYU_INSTANCEMapReduce服务(MRS)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_MRS_CLUSTER数据仓库服务(DWS)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DWS_CLUSTER分布式缓存服务(DCS)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_DCS_INSTANCEWeb应用防火墙(WAF)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_WAF_ENGINE云堡垒机(CBH)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_CBH_INSTANCE图引擎服务(GES)GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/CLOUD_GES_GRAPH租户信息项目/资源集GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/TENANT_PROJECT_VDC租户/VDCGET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/TENANT_VDC租户用户GET https://{OC北向接口域名}/rest/tenant-resource/v1/instances/TENANT_USER系统资源服务器GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_X86Server主机组GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_Cluster宿主机GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_PhysicalHost存储设备GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_StorDevice网络设备GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_NetworkDevice(根据class_Name区分:SYS_Switch-交换机、SYS_Router-路由器、SYS_Firewall-防火墙、SYS_LoadBalancer-负载均衡、SYS_FCSwitch-FC交换机、SYS_ThirdpartyNetWorkDevice-其他网络设备)管理面虚拟机GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_VM其他 区域/RegionGET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_BusinessRegion可用分区GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_Azone资源池GET https://{OC北向接口域名}/rest/cmdb/v1/instances/SYS_ResourcePool资源关系和接口调用示例可参考附件“北向资源查询参考.xlsx”。 其他相关资料:1资源接口查询条件书写说明cid:link_4说明使用查询条件查询资源(如虚拟机、物理机)数据2物理资源查询cid:link_5说明物理资源模型、如何通过API查询服务器、存储设备、网络设备,宿主机等3租户资源查询cid:link_6说明如何查询租户资源,如何通过API查询租户虚拟机、云磁盘、弹性IP等4虚拟资源关系查询cid:link_7说明如何查询区域、资源池、宿主机、虚拟机之间的关系5管理虚拟机查询cid:link_8说明如何查询管理虚拟机详情6租户维度资源查询cid:link_9说明如何按照VDC、project维度查询租户资源7管理节点宿主机查询https://bbs.huaweicloud.com/forum/thread-71325-1-1.html说明如何判断宿主机是否属于管理节点8获取虚拟资源到物理资源的拓扑关系cid:link_2说明如何获取虚拟资源到物理资源的拓扑关系
-
1、场景说明ManageOne运维侧支持对外提供资源池容量,可按照区域、可用分区的维度提供容量信息,可供客户上层系统作统一数据展示,如大屏报表等容量信息包括:cpu、memory(内存)、storage-pool(存储池)、eip(公网Ip)、bms(裸金属)、租户虚拟机总数、物理机总数(此处的物理机指宿主机)7个指标 2、使用流程如果您需要获取ManageOne中资源池的总容量,您需要:1、查询运维侧所有的区域2、查询每个区域的cpu、memory(内存)、storage-pool(存储池)、eip(公网Ip)容量、bms(裸金属),一般的使用超分后的容量3、查询每个区域下的虚拟机,物理机总数4、将所有区域的容量按照类型进行叠加,从而获得cpu、memory(内存)、storage-pool(存储池)、eip(公网Ip)、bms(裸金属)、虚拟机总数、物理机总数的总容量需要说明的是,这里获得的是所有区域的总容量,包括云平台管理分区和租户分区的容量,管理分区与租户分区是隔离的,二者相对独立,租户分区为租户申请资源使用的分区,管理分区为华为云Stack管理虚拟机所在分区。如果您希望将管理分区的容量与租户分区的容量区分开,您需要分别查询管理分区和租户分区的容量,步骤如下:1、查询运维侧所有的可用分区2、查询每可用分区的cpu、memory(内存)、storage-pool(存储池)、eip(公网Ip)、GPU卡容量,一般的使用超分后的容量3、查询每个可用分区下的虚拟机,物理机总数4、按照可用分区类型,将容量指标按类型进行叠加,从而获得cpu、memory(内存)、storage-pool(存储池)、eip(公网Ip)、租户虚拟机总数、物理机总数的总容量区域、资源池、可用分区关系说明:区域是地理位置,每个区域下关联多个资源池,每个资源池包含多个可用分区 2.1 查询资源池总容量步骤1: 获取Token后面的步骤都需要在请求的header里面加上X-Auth-Token参数。接口调用示例如下:调用方法:PUT调用URL:https://{运维侧对外访问域名}/rest/plat/smapp/v1/oauth/token请求头:Accept:application/json Content-Type:application/json;charset=UTF-8请求body:{ "grantType": "password", "userName": "XXX", "value": "***"}响应示例:{ "accessSession": "xxxxxxxxxxxxxxx", "roaRand": "xxxxxxxxxxxxxxx", "expires": 1800, "additionalInfo": null}accessSession的值即为token值步骤2 获取区域列表调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/cmdb/v1/instances/SYS_BusinessRegion请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxxxx响应示例: { "objList": [ { "mgmtNodeCpuArch": "unknown", "timezone": "Asia/Shanghai", "businessModel": "BusinessModelOne", "language": "zh_CN", "type": "private_cloud", "storTypeOfMgmt": "fusionstorage", "manufacturer": "华为", "serviceScale": "200pm_2000vm", "businessNetworkType": "ipv4v6", "last_updated_by": "system", "solutionVersion": "8.5.0", "networkNodeType": "vm", "regionType": "master", "cloudPlatformType": "HCS_MANAGE", "id": "853FFE094A6D339E97E84AD6BF06A531", "last_Modified": 1741088802130, "solutionType": "type_i", "supportRegionDr": false, "supportAzHa": false, "last_update_date": 1741088802130, "externalGlobalDomainNamePostfix": "in-horizontal-integ-verif.com", "globalServiceScale": "200pm_2000vm", "class_Id": 1232, "globalId": "sa-fb-1", "mgmtNetworkType": "ipv4", "globalDomainNamePostfix": "in-horizontal-integ-verif.com", "resId": "853FFE094A6D339E97E84AD6BF06A531", "is_Local": true, "locales": "{\"en_us\":\"东莞\",\"zh_cn\":\"东莞\"}", "solutionScense": "hcs", "class_Name": "SYS_BusinessRegion", "ocRegionLevel": "normal_center", "historyVersionList": "[\"8.2.0\",\"8.2.0.SPC10\",\"8.2.1\",\"8.2.1.SPH30\",\"8.3.0\",\"8.3.0.SPC010\",\"8.3.1\"]", "name": "东莞", "nativeId": "sa-fb-1", "threeDCInTwoPlaces": false, "status": "normal" } ], "totalNum": 1, "pageSize": 20, "totalPageNo": 1, "currentPage": 1}这可以获得各个region的resId,用于后续查询region容量的入参步骤3 查询每个区域的cpu、memory(内存)、storage-pool(存储池)、eip(公网Ip)、bms(裸金属)、obs(对象存储)容量注:obs容量需HCS 8.3.0及以上版本支持查询。调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/capacity/v1/capbase/regions/{region_id}/resource-types/cpu,memory,storage-pool,eip,bms/current-capacities,region_id由步骤2获取请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxxxx响应示例:{ "cpu": { "isDataEmpty": "false", "oversubscriptionCapacity": { "oversubscriptionRatio": 3.7697449, "totalCapacity": { "unit": "核", "capacityValue": "42862", "displayCapacity": "42862 核" }, "allocatedCapacity": { "unit": "核", "capacityValue": "19870", "displayCapacity": "19870 核", "ratio": 46.358078 }, "freeCapacity": { "unit": "核", "capacityValue": "22992", "displayCapacity": "22992 核", "ratio": 53.641922 } }, "actualCapacity": { "totalCapacity": { "unit": "核", "capacityValue": "11370", "displayCapacity": "11370 核" }, "usedCapacity": { "ratio": 20.725105, "unit": "核", "capacityValue": "0", "displayCapacity": "0 核" }, "freeCapacity": { "ratio": 79.274895, "unit": "核", "capacityValue": "0", "displayCapacity": "0 核" } }, "collectTime": "", "updateTime": -1 }, "memory": { "isDataEmpty": "false", "oversubscriptionCapacity": { "oversubscriptionRatio": 0.9999996, "totalCapacity": { "unit": "GB", "capacityValue": "85597.70896911621", "displayCapacity": "85597.70896911621 GB" }, "allocatedCapacity": { "unit": "GB", "capacityValue": "56084.628160476685", "displayCapacity": "56084.628160476685 GB", "ratio": 65.52118 }, "freeCapacity": { "unit": "GB", "capacityValue": "29513.080971717834", "displayCapacity": "29513.080971717834 GB", "ratio": 34.47882 } }, "actualCapacity": { "totalCapacity": { "unit": "GB", "capacityValue": "85597.744140625", "displayCapacity": "85597.744140625 GB" }, "usedCapacity": { "ratio": 56.800365, "unit": "GB", "capacityValue": "48619.830875396455", "displayCapacity": "48619.830875396455 GB" }, "freeCapacity": { "ratio": 43.199635, "unit": "GB", "capacityValue": "36977.913265228545", "displayCapacity": "36977.913265228545 GB" } }, "collectTime": "", "updateTime": -1 }, "storagePool": { "isDataEmpty": "false", "oversubscriptionCapacity": { "oversubscriptionRatio": 203.3243, "totalCapacity": { "unit": "TB", "capacityValue": "1824.6783294677734", "displayCapacity": " 1824.6783294677734 TB" }, "allocatedCapacity": { "unit": "TB", "capacityValue": "1387.3134765625", "displayCapacity": "1387.3134765625 TB", "ratio": 76.03058 }, "freeCapacity": { "unit": "TB", "capacityValue": "437.36483573913574", "displayCapacity": "437.36483573913574 TB", "ratio": 23.969421 } }, "actualCapacity": { "totalCapacity": { "unit": "TB", "capacityValue": "897.4226493835449", "displayCapacity": "897.4226493835449 TB" }, "usedCapacity": { "unit": "TB", "capacityValue": "347.8443183898926", "displayCapacity": "347.8443183898926 TB", "ratio": 38.76037 }, "freeCapacity": { "unit": "TB", "capacityValue": "549.5783405303955", "displayCapacity": "549.5783405303955 TB", "ratio": 61.23963 } }, "collectTime": "", "updateTime": -1 }, "eip": null, "bms": { "cpu": { "isDataEmpty": "false", "actualCapacity": { "totalCapacity": { "unit": "核", "capacityValue": "824", "displayCapacity": "824 核" }, "usedCapacity": { "unit": "核", "capacityValue": "696", "displayCapacity": "696 核", "ratio": 84.46602 }, "freeCapacity": { "unit": "核", "capacityValue": "128", "displayCapacity": "128 核", "ratio": 15.53398 } }, "collectTime": "", "updateTime": -1 }, "memory": { "isDataEmpty": "false", "actualCapacity": { "totalCapacity": { "unit": "GB", "capacityValue": "5760", "displayCapacity": "5760 GB" }, "usedCapacity": { "unit": "GB", "capacityValue": "5376", "displayCapacity": "5376 GB", "ratio": 93.333336 }, "freeCapacity": { "unit": "GB", "capacityValue": "384", "displayCapacity": "384 GB", "ratio": 6.6666665 } }, "collectTime": "", "updateTime": -1 }, "disk": { "isDataEmpty": "false", "actualCapacity": { "totalCapacity": { "unit": "TB", "capacityValue": "92.7099609375", "displayCapacity": "92.7099609375 TB" }, "usedCapacity": { "unit": "TB", "capacityValue": "92.7099609375", "displayCapacity": "92.7099609375 TB", "ratio": 100.0 }, "freeCapacity": { "unit": "TB", "capacityValue": "0", "displayCapacity": "0 TB", "ratio": 0.0 } }, "collectTime": "", "updateTime": -1 } }, "gpu": null, "npu": null, "obs": { "physicalCluster": [ { "regionName": "贵安水平集成验证环境", "regionId": "853FFE094A6D339E97E84AD6BF06A531", "clusterName": "obscluster", "type": "hdd", "physicalTotal": "120.86 TB", "physicalUsed": "83.1549 TB", "physicalLeft": "37.7051 TB", "physicalRatio": "68.8027%", "businessTotal": "66.8759 TB", "businessUsed": "46.0124 TB", "businessLeft": "20.8635 TB", "businessRatio": "68.8027%" } ], "tenant": [ { "tenantName": "测试租户", "tenantId": "457141b1e227426fa9e710c1a1fb7e96", "regionName": "东莞", "regionId": "853FFE094A6D339E97E84AD6BF06A531", "bucketName": "obs-48a3", "bucketUsed": "4.4342 MB" }, { "tenantName": "测试租户", "tenantId": "457141b1e227426fa9e710c1a1fb7e96", "regionName": "东莞", "regionId": "853FFE094A6D339E97E84AD6BF06A531", "bucketName": "obs-7afb", "bucketUsed": "0 MB" } ], "collectTime": null, "updateTime": -1 }}针对每个指标,取超分后的容量值即可,如CPU这一指标,我们选取超分的值,即:oversubscriptionCapacity的值,包括总容量(totalCapacity),已分配容量(allocatedCapacity),剩余容量(freeCapacity)注:其中CPU的used和free没有返回具体核数,是因为这块actualCapacity指的是实际容量,就是超分前的物理核数,只提供使用率,不提供使用量。因为使用量会计算出小数,可能会出现使用量为0.X核数,这不是一个正常CPU的数据,是不合理的,所以当前不提供实际物理的使用量和剩余量。步骤4 查询每个区域虚拟机、物理机总数调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/capacity/v1/capbase/regions/{region_id}/statistics,region_id由步骤2获取请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例:{ "host": { "isDataEmpty": "false", "normal": 12, "poweroff": 0, "fault": 0, "other": 0, "collectTime": "2020-02-04 16:04:53 CST", "updateTime": 1580803493996 }, "vm": { "isDataEmpty": "false", "running": 24, "stopped": 0, "hibernated": 1, "other": 0, "collectTime": "2020-02-04 16:04:53 CST", "updateTime": 1580803493996 }}host代表物理主机,vm代表租户虚拟机,您可以按照状态进行统计如果有多个region,您需要逐一查询每个region的资源容量,租户虚拟机,物理主机总数,然后按照指标类型相加获得资源池的总容量2.2 查询可用分区容量步骤1: 获取Token后面的步骤都需要在请求的header里面加上X-Auth-Token参数。接口调用示例如下:调用方法:PUT调用URL:https://{运维侧对外访问域名}/rest/plat/smapp/v1/oauth/token请求头:Accept:application/json Content-Type:application/json;charset=UTF-8请求body:{ "grantType": "password", "userName": "XXX", "value": "***"}响应示例:{ "accessSession": "xxxxxxxxxxxxx", "roaRand": "xxxxxxxxxxxxx", "expires": 1800, "additionalInfo": null}accessSession的值即为token值步骤2 获取可用分区列表调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/cmdb/v1/instances/SYS_Azone请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例: "currentPage": 1}{ "objList": [ { "ownerType": "compute", "backendStorIps": "{\"murano\":\"160.132.61.2,160.132.62.2\"}", "backendStorName": "[\"murano\"]", "reuseStorage": false, "virtualizeType": "kvm", "regionName": "Global", "ownerId": "48CA71E447BE3CFE8E260A4CD9DB5BEF", "deviceName": "manage-az", "azLayer": "tiled", "ownerName": "nova_az7.dc7_FUSION_CLOUD_sa-fb-1", "confirmStatus": "unconfirmed", "id": "BC833A0095A63C988A79E52F6CC18029", "last_Modified": 1568754332671, "state": "", "vncPort": 8008, "manager": true, "manageAz": "na", "class_Id": 1058, "cpuArch": "x86", "resId": "BC833A0095A63C988A79E52F6CC18029", "resourcePoolName": "OpenStack_sa-fb-1", "keystoneId": "8E3B2BBADF433102BB566CD571C74882", "logicalRegionId": "853FFE094A6D339E97E84AD6BF06A531", "class_Name": "SYS_Azone", "heterogeneousStorage": false, "regionId": "C4CA4238A0B933828DCC509A6F75849B", "resourcePoolId": "25216A596C493169B7D106ECB32E83F8", "backendStorType": "ip_san", "name": "manage-az", "nativeId": "manage-az" }, { "ownerType": "compute", "backendStorIps": "{\"Business_Pool\":\"160.132.61.3,160.132.62.3\"}", "backendStorName": "[\"Business_Pool\"]", "globalName": "生态集成", "reuseStorage": false, "virtualizeType": "kvm", "regionName": "Global", "ownerId": "48CA71E447BE3CFE8E260A4CD9DB5BEF", "deviceName": "az7.dc7", "azLayer": "tiled", "ownerName": "nova_az7.dc7_FUSION_CLOUD_sa-fb-1", "confirmStatus": "unconfirmed", "id": "97122CC306D53D6584278F5D04210618", "last_Modified": 1572222270932, "state": "", "vncPort": 8008, "manager": false, "manageAz": "na", "class_Id": 1058, "cpuArch": "x86", "resId": "97122CC306D53D6584278F5D04210618", "resourcePoolName": "OpenStack_sa-fb-1", "tags": "{\"cloud_location\":[\"1\"],\"virtual_capability\":[\"KVM\"],\"arch_type\":[\"x86_64\"],\"storage_capability\":[\"OceanStor V3\"],\"display_name\":[\"生态集成\"],\"network_capability\":[\"neutron\"]}", "keystoneId": "8E3B2BBADF433102BB566CD571C74882", "logicalRegionId": "853FFE094A6D339E97E84AD6BF06A531", "class_Name": "SYS_Azone", "heterogeneousStorage": false, "regionId": "C4CA4238A0B933828DCC509A6F75849B", "resourcePoolId": "25216A596C493169B7D106ECB32E83F8", "backendStorType": "ip_san", "name": "生态集成", "nativeId": "az7.dc7" } ], "totalNum": 2, "pageSize": 20, "totalPageNo": 1, "currentPage": 1}这可以获得各个azone的resId,用于后续查询azone容量的入参,azone名称为“manage-az”的为管理分区,azone名称为其他的为租户分区步骤3 查询每个可用分区的cpu、memory(内存)、storage-pool(存储池)、bms(裸金属)容量调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/capacity/v1/capbase/azones/{azone_id}/resource-types/cpu,memory,storage-pool,bms/current-capacities,azone_id由步骤2获取可用分区的容量指标不包含公网IP(eip),支持查询裸金属服务器(bms)容量请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例:{ "cpu": { "isDataEmpty": "false", "oversubscriptionCapacity": { "oversubscriptionRatio": 1.8688525, "totalCapacity": { "unit": "核", "capacityValue": "228", "displayCapacity": "228 核" }, "allocatedCapacity": { "unit": "核", "capacityValue": "32", "displayCapacity": "32 核", "ratio": 14.035088 }, "freeCapacity": { "unit": "核", "capacityValue": "196", "displayCapacity": "196 核", "ratio": 85.96491 } }, "actualCapacity": { "totalCapacity": { "unit": "核", "capacityValue": "122", "displayCapacity": "122 核" }, "usedCapacity": { "ratio": 0.69101924, "unit": "核", "capacityValue": "0", "displayCapacity": "0 核" }, "freeCapacity": { "ratio": 99.30898, "unit": "核", "capacityValue": "0", "displayCapacity": "0 核" } }, "collectTime": "", "updateTime": -1 }, "memory": { "isDataEmpty": "false", "oversubscriptionCapacity": { "oversubscriptionRatio": 1, "totalCapacity": { "unit": "GB", "capacityValue": "733.044921875", "displayCapacity": "733.044921875 GB" }, "allocatedCapacity": { "unit": "GB", "capacityValue": "41.181640625", "displayCapacity": "41.181640625 GB", "ratio": 5.6178875 }, "freeCapacity": { "unit": "GB", "capacityValue": "691.86328125", "displayCapacity": "691.86328125 GB", "ratio": 94.38211 } }, "actualCapacity": { "totalCapacity": { "unit": "GB", "capacityValue": "733.044921875", "displayCapacity": "733.044921875 GB" }, "usedCapacity": { "ratio": 3.8166666, "unit": "GB", "capacityValue": "27.977881326739", "displayCapacity": "27.977881326739 GB" }, "freeCapacity": { "ratio": 96.183334, "unit": "GB", "capacityValue": "705.067040548261", "displayCapacity": "705.067040548261 GB" } }, "collectTime": "", "updateTime": -1 }, "storagePool": { "isDataEmpty": "false", "oversubscriptionCapacity": { "oversubscriptionRatio": 300, "totalCapacity": { "unit": "TB", "capacityValue": "6.4072265625", "displayCapacity": " 6.4072265625 TB" }, "allocatedCapacity": { "unit": "TB", "capacityValue": "0.3447265625", "displayCapacity": "0.3447265625 TB", "ratio": 5.3802776 }, "freeCapacity": { "unit": "TB", "capacityValue": "6.0625", "displayCapacity": "6.0625 TB", "ratio": 94.61972 } }, "actualCapacity": { "totalCapacity": { "unit": "TB", "capacityValue": "2.1357421875", "displayCapacity": "2.1357421875 TB" }, "usedCapacity": { "unit": "TB", "capacityValue": "0.34735107421875", "displayCapacity": "0.34735107421875 TB", "ratio": 16.263718 }, "freeCapacity": { "unit": "TB", "capacityValue": "1.78839111328125", "displayCapacity": "1.78839111328125 TB", "ratio": 83.73628 } }, "collectTime": "", "updateTime": -1 }, "eip": null, "bms": null, "gpu": null, "npu": null}针对每个指标,取超分后的容量值即可,如CPU这一指标,我们选取超分的值,即:oversubscriptionCapacity的值,包括总容量(totalCapacity),已分配容量(allocatedCapacity),剩余容量(freeCapacity)注:其中CPU的used和free没有返回具体核数,是因为这块actualCapacity指的是实际容量,就是超分前的物理核数,只提供使用率,不提供使用量。因为使用量会计算出小数,可能会出现使用量为0.X核数,这不是一个正常CPU的数据,是不合理的,所以当前不提供实际物理的使用量和剩余量。步骤4 查询每个可用分区虚拟机、物理机总数调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/capacity/v1/capbase/azones/{azone_id}/statistics,azone_id由步骤2获取请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例:{ "host": { "isDataEmpty": "false", "normal": 4, "poweroff": 0, "fault": 0, "other": 0, "collectTime": "2020-02-04 16:34:53 CST", "updateTime": 1580805293995 }, "vm": { "isDataEmpty": "false", "running": 1, "stopped": 0, "hibernated": 1, "other": 0, "collectTime": "2020-02-04 16:34:53 CST", "updateTime": 1580805293995 }}host代表物理主机,vm代表租户虚拟机,您可以按照状态进行统计如果有多个azone,您需要逐一查询每个azone的资源容量,租户虚拟机,物理主机总数,然后按照指标类型相加获得管理分区、租户分区的总容量
-
1、场景说明客户已经有成熟的统一性能监控平台,需要HCS将各类云资源、物理资源等相关性能数据上报完成统一监控管理2、使用流程能监控通过采集监控对象性能指标,帮助运维人员发现潜在风险,并及时通知。ManageOne运维侧支持服务器、存储、网络设备的性能集中监控,系统可以周期的从服务器、虚拟机采集各类性能指标并进行统计分析。ManageOne运维侧还支持对于性能指标还可以设置阈值告警,当指标超过阈值时,系统会产生告警。ManageOne运维侧对外开放性能查询的RESTful接口,第三方可以通过调用这些接口获取所需要的监控指标值。查询性能数据有如下约束:不是所有资源类型都支持性能查询,首先要通过查询监控对象类型来确认资源的类型是否支持。性能查询接口一次只能查询一种类型的性能数据,而且所有的指标必须都属于这个类型。对于每个ManageOne平台,通过北向接口查询获取到的监控对象类型id(obj_type_id),以及每个监控对象类型所支持的监控指标(indicators)和指标Id是固定的,获取到这些Id之后可以存储在本地,不需要再调运维侧接口获取流程如下:具体步骤如下:首先查询监控对象类型,只有在这些类型里面的资源才可以查询性能数据。根据查出的监控类型查询资源数据,获取资源ID。 根据监控类型查询此类型支持的指标,查询结果为指标的ID列表。根据资源ID和指标ID查出该资源的指定指标的具体数值。查询出的结果只显示指标ID,因此还要调用根据指标ID查询指标描述的接口。 组合指标数值和指标描述,得到完整的性能信息。查询最新性能:查询最新性能数据,返回最近60分钟内的一条最新数据(包含第60分钟)。接口详细描述参考《ManageOne 6.5.1 运维面北向API参考》。接口调用约束:l 每次传入的监控对象(obj_ids)数*监控指标(indicator_ids)数不大于100。l 指标ID列表(indicator_ids)必须属于监控类型(obj_type_id)。l 资源ID列表(obj_ids)必须属于监控类型(obj_type_id)。查询步骤: 步骤1: 获取Token后面的步骤都需要在请求的header里面加上X-Auth-Token参数。接口调用示例如下:调用方法:PUT调用URL:https://{运维侧对外访问域名}/rest/plat/smapp/v1/oauth/token请求头:Accept:application/json Content-Type:application/json;charset=UTF-8请求body:{ "grantType": "password", "userName": "XXX", "value": "***"}响应示例:{ "accessSession": "xxxxxxxxxxxxx", "roaRand": "xxxxxxxxxxxxx", "expires": 1800, "additionalInfo": null}accessSession的值即为token值步骤2 获取监控类型列表 此处以CLOUD_VM为例,获取obj_type_id,接口调用示例如下:调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/performance/v1/mgr-svc/obj-types请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例(部分示例):{ "status_code": 200, "error_code": 0, "error_msg": "Successful", "data": [ { "obj_type_id": 562958543355904, "parent_obj_type_id": 1407379178520576, "resource_category": "CLOUD_VM", "resource_provider": "ict-resource", "en_us": "Elastic Cloud Server", "zh_cn": "弹性云服务器", "group_en_us": "Cloud Resource", "group_zh_cn": "云资源" }, { "obj_type_id": 562967133290496, "parent_obj_type_id": 0, "resource_category": "CLOUD_VOLUME", "resource_provider": "ict-resource", "en_us": "Elastic Volume", "zh_cn": "云硬盘", "group_en_us": "Cloud Resource", "group_zh_cn": "云资源" } ] }在响应体中找到 resource_category": "CLOUD_VM", 的类型项,查询到CLOUD_VM对应的obj_type_id为562958543355904。步骤3 查询监控类型支持的指标ID列表此处列出了CLOUD_VM所有支持的指标ID,接口调用示例如下:调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/performance/v1/mgr-svc/obj-types/562958543355904/indicators,562958543355904为上一步查询所得的CLOUD_VM的监控类型Id请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例:{ "status_code": 200, "error_code": 0, "error_msg": "Successful", "data": { "indicator_ids": [ 562958543421441, 562958543486979, 562958543552537, 562958543552538, 562958543552539, 562958543552550, 562958543618052, 562958543618061, 562958543618062, 562958543618067, 562958543618068, 562958543618071, 562958543618072, 562958543618073, 562958543618074, 562958543618075, 562958543618076, 562958543618077, 562958543618078, 562958543618079, 562958543618080, 562958543618081, 562958543618082 ] } }返回的indicator_ids的值即为CLOUD_VM所有支持的指标ID步骤4 查询指标含义调用方法:POST调用URL:https://{运维侧对外访问域名}/rest/performance/v1/mgr-svc/indicators请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx请求体:[562958543421441,562958543618075]响应示例:{ "status_code": 200, "error_code": 0, "error_msg": "Successful", "data": { "562958543618075": { "kpi": 0, "data_type": "float", "data_unit": "KB/s", "en_us": "Outband Outgoing Rate", "zh_cn": "带外网络流出速率", "group_en_us": null, "group_zh_cn": null, "tag": "", "alarm_id": null, "alarm_desc_en_us": null, "alarm_desc_zh_cn": null, "indicator_name": "network_outgoing_bytes_aggregate_rate" }, "562958543421441": { "kpi": 1, "data_type": "float", "data_unit": "%", "en_us": "CPU Usage", "zh_cn": "CPU使用率", "group_en_us": null, "group_zh_cn": null, "tag": "CLOUD_VM_USAGE", "alarm_id": null, "alarm_desc_en_us": null, "alarm_desc_zh_cn": null, "indicator_name": "cpuUsage" } }}注:租户资源来源系统基本上都为FSP,物理资源大多为eSight,少数为ZOHO系统,请根据实际环境对接系统过滤性能指标统一模型参考文档中'Source System Type'列,获取支持的指标ID,其中指标ID在ManageOne各版本均为固定值不会随版本变动。步骤5 查询资源列表此处随机查询1台租户虚拟机(类型名称为CLOUD_VM)记录,获取其ID。接口调用示例如下:调用方法:GET调用URL:https://{运维侧对外访问域名}/rest/tenant-resource/v1/instances/CLOUD_VM?pageNo=1&pageSize=1000请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx响应示例:{ "objList": [ { "ownerType": "compute", "extraSpecs": "{\"ips\":\"@192.168.0.129@\",\"cpuCoreNum\":4}", "azoneName": "az7.dc7", "privateIps": "@192.168.0.129@", "regionName": "Global", "flavorId": "8776AA3F93593999A48DC545CCB03E30", "clusterId": "5B16AC1483F634BAA0F040EB08D708BA", "ownerId": "0D9ECCF86FF337C08E5DB07FA5CFE2C7", "cloudLocationName": "华为", "createdAt": "2019-05-29T09:30:02Z", "powerState": "1", "taskState": "", "tenantName": "", "cloudType": "localcloud", "clusterName": "HostGroup1", "id": "D912DA2B8D0639708A7D5726DD66C4CD", "last_Modified": 1559122262393, "vdcId": "fc9b5ace-5650-481f-9c24-060140e9ca16", "podId": "27A0BDF03E1E3A56A6C6F0775A977553", "bizRegionId": "853FFE094A6D339E97E84AD6BF06A531", "imageId": "AC5AE9DB90A43041B6249711FD7B0DA4", "floatingIp": "", "hostId": "D3711A402B753D23A1D058EF203007B9", "hypervisorType": "kvm", "resId": "D912DA2B8D0639708A7D5726DD66C4CD", "userId": "6354cbc75cd14acab09307a8d78d1622", "resourcePoolName": "OpenStack_sa-fb-1", "tags": "", "class_Name": "CLOUD_VM", "azoneId": "97122CC306D53D6584278F5D04210618", "physicalHostId": "D3711A402B753D23A1D058EF203007B9", "regionId": "C4CA4238A0B933828DCC509A6F75849B", "resourcePoolId": "25216A596C493169B7D106ECB32E83F8", "name": "ecs-5aa6-wp", "tenantId": "", "vdcName": "wp_vdc", "nativeId": "162cf72b-4dab-45cf-84e6-5e4b87ca0783", "launchedAt": "2019-05-29T09:30:12.000000", "cloudLocationId": "85E0C89C436633E48292592CFE55B7BB", "projectId": "e711f3cb1be84d87934123b94f2198e7", "vmState": "active", "bizRegionName": "华南地区", "cpuCoreNum": "4", "status": "active" } ], "totalNum": 47, "pageSize": 1, "totalPageNo": 47, "currentPage": 1 }获取租户虚拟机的资源ID(resId字段)。此处为:"resId": "D912DA2B8D0639708A7D5726DD66C4CD"步骤6 查询性能查询性能数据,根据传入参数中的"range"字段所取的枚举值或从开始到结束时间范围内的查询数据。有汇聚数据情况下,返回结果序列是平均值序列,并包含最大值、最小值以及对应时间戳。接口详细描述参考《ManageOne 6.5.X/8.X 运维面API参考 》。约束:l 每次传入的监控对象(obj_ids)数*监控指标(indicator_ids)数不大于100。l 指标ID列表(indicator_ids)必须属于监控类型(obj_type_id)。l 资源ID列表(obj_ids)必须属于监控类型(obj_type_id)。请求示例:调用方法:POST调用URL:https://{运维侧对外访问域名}/rest/performance/v1/data-svc/history-data/action/query请求头:Accept:application/json Content-Type:application/json;charset=UTF-8 X-Auth-Token:xxxxxxxxxxxxx请求体:(obj_type_id从步骤2获取;indicator_ids从步骤3获取;obj_ids从步骤5获取){ "obj_type_id": "562958543355904", "indicator_ids": ["562958543421441"], "obj_ids": ["D912DA2B8D0639708A7D5726DD66C4CD"], "range": "LAST_1_HOUR", "interval": "MINUTE"}响应体:{ "data": { "D912DA2B8D0639708A7D5726DD66C4CD": { "562958543421441": { "avg": { "1468483570000": "5.97" }, "min": { "1468483570000": "5.72" }, "max": { "1468483630000": "6.509" }, "series": [{ "1468483570000": "5.72" }, { "1468483575000": "5.72" }, { "1468483630000": "6.509" }, { "1468483635000": "6.509" }, { "1468483690000": "5.80" }, { "1468483695000": "5.80" }] } } }, "errorCode": 0, "errorMsg": "Successful.", "statusCode": 200}至此,我们查询得到了对应指标的最新采集值。结合步骤4,可以得知响应体中每个指标的含义。下面对历史性能查询接口中时间范围的取值进行说明,首先我们对其中几个关键参数的含义进行说明,如下表:参数名类型值域参数含义intervalStringMINUTE(分钟)HOUR(小时)DAY(天)WEEK(星期)MONTH(月)代表历史性能数据的采样间隔,该参数需要配合range参数使用,interval的值需要是range中支持的采样间隔,比如:range选择LAST_5MINUTE(最近5分钟),interval就只能是MINUTE(分钟);如果range选择LAST_1_HOUR,interval也只能选择MINUTE,而不能是HOUR等其他参数rangeStringLAST_5_MINUTE(最近5分钟,返回数据粒度为分钟,由于底座和ManageOne的时间可能存在误差,最近5分钟可能查询不到数据,此情况下建议取最近1小时的数据)LAST_1_HOUR(最近1小时,返回数据粒度为分钟)LAST_1_DAY(最近1天,返回数据粒度支持分钟、小时,默认按小时返回)LAST_1_WEEK(最近1星期,返回数据支持分钟、小时、天,默认按天返回)LAST_1_MONTH(最近1个月,返回数据支持分钟、小时、天、星期默认按星期返回)LAST_1_QUARTER(最近一个季度,返回数据支持分钟、小时、天、星期、月,默认按月返回)HALF_1_YEAR(最近半年,返回数据支持分钟、小时、天、星期、月、季度,默认按季度返回)LAST_1_YEAR(最近1年,返回数据支持分钟、小时、天、星期、月、季度、半年,默认按半年返回)BEGIN_END_TIME(自定义时间段)INVALID(无效时间)默认值:INVALID代表历史性能数据的时间范围,支持您查询最近5分钟、1小时到最近1年的数据,返回数据的粒度,最低为1分钟,最大为半年;range参数取值为BEGIN_END_TIME时,支持您自定义时间范围去获取数据,需配合begin_time、end_time两个参数使用。begin_timeint64无,取值为毫秒格式表示的时间查询开始时刻,必须比 end_time 小,仅 range 为 BEGIN_END_TIME 时生效end_timeint64无,取值为毫秒格式表示的时间查询结束时刻,必须比 begin_time大,仅 range 为 BEGIN_END_TIME 时生效补充说明:分钟粒度的性能数据保存7天,小时粒度的性能数据,保存2年下面给出常用的几种查询指定时间段历史性能数据的方式:1、如果您需要定时采集历史性能数据并入库,建议您设置采集周期为1小时,每次采集最近1小时的数据,这样您每次可以获取到指定资源在最近一小时内的数据,每天只需要采集24次,粒度为分钟,示例如下:{ "obj_type_id": "562958543355904", //监控对象类型Id "indicator_ids": ["562958543421441"], //指标Id,支持多个 "range": "LAST_1_HOUR", "interval": "MINUTE", "obj_ids": ["7786B94E1DC7374FBEB4DBDF9D7384F0"]//资源Id,支持多个}2、如果您需要补采指定时间段内的性能数据,您可参考如下方式:{ "obj_type_id": "562958543355904", //监控对象类型Id "indicator_ids": ["562958543421441"], //指标Id,支持多个 "range": "BEGIN_END_TIME", //固定值 "interval":"MINUTE", //根据指定的时间段范围确定,比如,begin_time为2020-02-20 00:00:00,end_time为2020-02-25 00:00:00共5天,那么我们可以设置采样粒度为分钟、小时、天 "begin_time":1582163984000, //采集开始时间,毫秒串格式,必须比begin_time小 "end_time":1582682384000, //采集结束时间,毫秒串格式,必须比begin_time大 "obj_ids": ["7786B94E1DC7374FBEB4DBDF9D7384F0"] //资源Id,支持多个}
-
1、场景说明客户已有统一告警管理平台,需要HCS的告警上报实现统一管理流程 2、使用流程2.1准备工作第三方运维系统需要通过SNMP方式与ManageOne运维面对接时,需要做一些准备工作,才能完成与ManageOne运维面进行对接。2.1.1 获取接口文档接口文档可联系华为工程师从华为官网下载,下载链接参考: cid:link_1 第5章节。请结合现网具体交付的版本下载接口文档,若需要英文版接口文档,点击浏览器右上角切换语言,即可获得。下载得到的华为云Stack解决方案的完整接口文档,我们打开压缩包,提取ManageOne API参考文档包,然后打开该文档包,找出下图红框标注的文档(以6.5.1接口文档接口为例,适用于8.x版本):各文档作用说明如下:《ManageOne-NBI-Alarm-MIB-V1.mib》:运维侧SNMP Trap上报告警的MIB文件,采用SMI(Structure of Management Information)V1描述《ManageOne-NBI-Alarm-MIB-V2.mib》:运维侧SNMP Trap上报告警的MIB文件,采用SMI(Structure of Management Information)V2描述《ManageOne 6.5.1 北向告警SNMP接口开发指南 03.doc》:SNMP Trap对接开发指南,讲述了ManageOne 6.5.1运维侧的SNMP接口能力和OID描述(实时告警的OID描述,参考该文档的3.1章节)说明:《ManageOne-NBI-Alarm-MIB-V1.mib》和《ManageOne-NBI-Alarm-MIB-V2.mib》需要提供给第三方网管系统,以便解析ManageOne 运维侧上报的告警信息,一般提供V2版本即可2.1.2 获取第三方网管系统SNMP配置信息ManageOne 6.5.x/8.x运维侧支持SNMPv1、SNMPv2C、SNMPv3协议,安全起见,建议对接时第三方网管使用SNMPv3版本与ManageOne运维侧进行对接。如果现网需要使用SNMPv1、SNMPv2C,请在征得客户同意后,联系ManageOne维护接口人,修改ManageOne支持的SNMP协议范围。以SNMPv3协议为例,需要第三方网管提供的信息有:配置项示例第三方网管的IP地址192.168.1.1第三方网管SNMP服务监听的端口号162协议版本号SNMPv3安全用户名thirdSnmpServer授权认证密码 数据加密密码 发送告警Trap的编码(第三方网管为接收方)UTF-8鉴权协议SHA加密协议AES-1282.1.3网络预配置为保证运维侧告警能顺利推送给第三方网管,需要确保ManageOne运维侧以下节点IP可以访问第三方网管的SNMP监听端口,访问关系如下:源端(可从LLD中获取以下节点的IP)源端口目的端(第三方网管提供)目的端口(第三方网管提供)ManageOne-Service0127318第三方网管浮动IP,例如:192.168.1.1第三方网管的SNMP服务监听端口,如162ManageOne-Service0227318第三方网管浮动IP,例如:192.168.1.1第三方网管的SNMP服务监听端口,如162正式配置对接前,请联系客户完成网络打通。可参考以下方式获取SNMP上报的源端IP和端口联系华为现场工程师,获取ManageOne运维侧登录地址和账号。登录ManageOne运维面,进入“系统->系统设置->北向接口->基本配置”获取“发送Trap地址”和“发送Trap端口”(没有勾选的地址建议同步打通网络)2.2 对接配置获取到第三方网管系统的SNMP配置信息之后,需要在ManageOne上配置上层网管对接信息,步骤如下:联系华为现场工程师,获取ManageOne运维侧登录地址和账号。登录ManageOne运维面,进入“系统->系统设置->北向接口->第三方系统配置”,点击”创建“,将第2.2章节中获取的第三方网管SNMP配置信息填写到对应的选项中,如下图所示:配置完成后,点击“创建”,完成网管SNMP参数和告警过滤条件的配置(不配置过滤条件默认上报全部告警)。从上图中可以看到,我们可以根据需要配置上报的指定设备类型产生的告警,上报指定级别的告警,并且按照告警分类上报针对第三方网管的一些特殊需求,我们还可以调整SNMP Trap上报告警的时区、时间格式、编码格式等,方法如下:登录ManageOne运维面,进入“系统->系统设置->北向接口->基本配置”,可配置时区、编码格式、鉴权协议、加密协议等参数,如下图:请注意,此处的协议参数配置需要与第三方网管相同(EngineID一般可忽略),否则第三方网管将无法正常解析SNMP报文。在此处勾选需要上报的字段。需要注意,扩展字段默认未勾选,如果有需要的字段,请在此处勾选,否则第三方网管将无法接收到这些字段。扩展字段对应的说明如下:(8.x以上版本)字段描述说明RootAlarm根因告警 AssociateAlarmGroup关联告警组 ArrivedEMSTime告警到达网管时间 GroupID告警分组ID ExtendProductItem5扩展字段5告警所影响的业务名称。ExtendProductItem6扩展字段6告警标识 (字符串类型AlarmID)。ExtendProductItem7扩展字段7告警名称。ExtendProductItem8扩展字段8告警RCA分析结果信息。说明:一般的,SNMP Trap是发送给SNMP 服务端的通知网络状况等的警告消息,而Inform是需要SNMP 服务端确认接收的Trap。与Inform 相比较,Trap通知方式为不可靠传输,因为SNMP 服务端在收到一条Trap通知后无需回复任何确认信息,所以SNMP agent无法知道Trap通知是否已经被snmp管理端正确接收其中:1、CSN(告警的网络流水号)唯一标识一条告警,同一条告警的清除、确认、反确认、变更告警网络流水号相同。2、AlarmID(告警ID)是告警类型的唯一标识符,全量的告警类型列表可通过以下方法获取:OC主页->"集中监控"->“告警管理”->"告警扩展",选择左侧菜单列表的“告警扩展”,选择“告警信息导出”。单击“导出”后,可获得如下excel文件:2.3 示例程序Java语言:(使用任意华为公有云帐号登录即可)cid:link_0Python语言:暂无示例程序,可使用net-snmp、pysnmp 等第三方库进行对接。5 附录5-1 页面告警与OID的对应关系示例:(注:1.下图中x表示"1.3.6.1.4.1.2011.2.15.2.4.3.3"。2. 未标注的字段表示暂无与之对应的OID。3. x.39以键值对格式存放可选拓展字段,示例可参考5-3)5-2 SNMP报文示例(对应5-1的告警,实际上报的Trap中OID末尾会带有“.0”作为该OID的实例。)1.3.6.1.2.1.1.3.0 = 4 days, 7:11:53.701.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.0.11.3.6.1.4.1.2011.2.15.2.4.3.3.1.0 = 171304711.3.6.1.4.1.2011.2.15.2.4.3.3.2.0 = 91.3.6.1.4.1.2011.2.15.2.4.3.3.3.0 = 2022-10-08 00:49:021.3.6.1.4.1.2011.2.15.2.4.3.3.4.0 = 28d5aff847ee411b87241b68183da9bcin011.3.6.1.4.1.2011.2.15.2.4.3.3.5.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.6.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.7.0 = DefaultMedn1.3.6.1.4.1.2011.2.15.2.4.3.3.8.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.9.0 = 50124161.3.6.1.4.1.2011.2.15.2.4.3.3.10.0 = 71.3.6.1.4.1.2011.2.15.2.4.3.3.11.0 = 21.3.6.1.4.1.2011.2.15.2.4.3.3.12.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.13.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.14.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.15.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.16.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.17.0 = 2785615221.3.6.1.4.1.2011.2.15.2.4.3.3.18.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.19.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.20.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.21.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.22.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.23.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.24.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.25.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.26.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.27.0 = Identity=Toggling Alarm, system:DBS:Service:mysqlBackupService,module:startLobBackup,instance:28d5aff847ee411b87241b68183da9bcin011.3.6.1.4.1.2011.2.15.2.4.3.3.28.0 = action=startLobBackup,instanceId=28d5aff847ee411b87241b68183da9bcin01,projectId=063094e04ef94614a74191c15bd02f0d,reason="failed to startLobBackup, cause when change log backup method, failed to access obs service, instanceId=28d5aff847ee411b87241b68183da9b1.3.6.1.4.1.2011.2.15.2.4.3.3.29.0 = Please refer to the alarm help1.3.6.1.4.1.2011.2.15.2.4.3.3.30.0 = 1.The agent is abnormal.2.OBS service is abnormal and incremental backup upload failed.1.3.6.1.4.1.2011.2.15.2.4.3.3.31.0 = 10.10.4.1241.3.6.1.4.1.2011.2.15.2.4.3.3.32.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.33.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.34.0 = 2022-10-08 00:49:021.3.6.1.4.1.2011.2.15.2.4.3.3.35.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.36.0 = 50124161.3.6.1.4.1.2011.2.15.2.4.3.3.37.0 = failed to startLobBackup1.3.6.1.4.1.2011.2.15.2.4.3.3.38.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.39.0 = 7b:22:6d:6f:63:22:3a:22:4e:45:57:44:42:53:22:2c:22:73:70:65:63:69:61:6c:41:6c:61:72:6d:53:74:61:74:75:73:22:3a:30:2c:22:6c:6f:67:69:63:61:6c:52:65:67:69:6f:6e:4e:61:6d:65:22:3a:22:e4:b8:9c:e8:8e:9e:22:2c:22:61:7a:6f:6e:65:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:61:64:64:72:65:73:73:22:3a:22:31:30:2e:31:30:2e:34:2e:31:32:34:22:2c:22:6d:65:54:79:70:65:22:3a:6e:75:6c:6c:2c:22:6f:72:69:67:69:6e:53:79:73:74:65:6d:4e:61:6d:65:22:3a:22:52:44:53:5f:73:6f:6c:75:74:69:6f:6e:2d:61:64:76:61:6e:63:65:2d:31:22:2c:22:72:65:73:50:6f:6f:6c:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:6f:72:69:67:69:6e:53:79:73:74:65:6d:54:79:70:65:22:3a:22:43:6c:6f:75:64:53:65:72:76:69:63:65:22:2c:22:61:6c:61:72:6d:47:72:6f:75:70:49:64:22:3a:22:32:37:38:35:36:31:35:32:32:22:2c:22:6d:61:74:63:68:4b:65:79:22:3a:22:62:31:38:39:64:61:30:62:2d:63:38:38:38:2d:34:65:34:30:2d:62:31:33:31:2d:63:65:63:36:33:31:63:37:38:37:66:62:22:2c:22:6d:61:6e:75:66:61:63:74:75:72:65:72:22:3a:22:68:75:61:77:65:69:22:2c:22:6c:6f:67:69:63:61:6c:52:65:67:69:6f:6e:49:64:22:3a:22:35:44:45:44:43:36:33:33:43:38:38:39:33:41:43:39:38:46:43:35:45:32:31:42:38:38:35:38:33:41:30:45:22:2c:22:72:65:61:73:6f:6e:49:64:22:3a:30:2c:22:64:63:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:64:6f:6d:61:69:6e:22:3a:6e:75:6c:6c:2c:22:72:75:6c:65:4e:61:6d:65:22:3a:22:5b:49:6e:74:65:72:6d:69:74:74:65:6e:74:2f:54:6f:67:67:6c:69:6e:67:20:41:6c:61:72:6d:20:48:61:6e:64:6c:69:6e:67:20:52:75:6c:65:5d:50:72:65:73:65:74:2d:49:6e:74:65:72:6d:69:74:74:65:6e:74:20:6f:72:20:54:6f:67:67:6c:69:6e:67:20:52:75:6c:65:20:66:6f:72:20:41:6c:6c:20:41:6c:61:72:6d:73:2c:20:5b:49:64:65:6e:74:69:66:69:63:61:74:69:6f:6e:20:52:75:6c:65:5d:75:70:67:72:61:64:65:5f:61:6c:61:72:6d:5f:69:64:65:6e:74:69:66:69:63:61:74:69:6f:6e:5f:72:75:6c:65:22:2c:22:63:6f:6d:6d:65:6e:74:22:3a:6e:75:6c:6c:2c:22:76:64:63:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:6e:61:74:69:76:65:4d:65:44:6e:22:3a:22:32:38:64:35:61:66:66:38:34:37:65:65:34:31:31:62:38:37:32:34:31:62:36:38:31:38:33:64:61:39:62:63:69:6e:30:31:22:2c:22:69:6e:76:61:6c:69:64:61:74:65:64:22:3a:30:2c:22:76:64:63:49:64:22:3a:6e:75:6c:6c:7d1.3.6.1.4.1.2011.2.15.2.4.3.3.40.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.41.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.42.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.43.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.44.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.45.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.46.0 = 1.3.6.1.4.1.2011.2.15.2.4.3.3.47.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.48.0 = 11.3.6.1.4.1.2011.2.15.2.4.3.3.49.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.50.0 = 01.3.6.1.4.1.2011.2.15.2.4.3.3.51.0 = Toggling time=214, userName=op_svc_appcube_1f48972c3ddf49048a7b9012e5d27dc8_solution-advance-1, instanceName=rds-instance-appcube23ec5a05bb5fc41b2ac8723d462159dff, CloudService=RDS,Service=DBS-MySQL-Server,MicroService=DBS-mysql-backupmanager, NativeMeDn=8.98.132.200;5-3 SNMP报文解码部分告警Trap可能需要解码才能够正常解析,例如5-2中的1.3.6.1.4.1.2011.2.15.2.4.3.3.39.0:解码前:1.3.6.1.4.1.2011.2.15.2.4.3.3.39.0 = 7b:22:6d:6f:63:22:3a:22:43:4c:4f:55:44:5f:52:4f:4d:41:5f:49:4e:53:54:41:4e:43:45:22:2c:22:73:70:65:63:69:61:6c:41:6c:61:72:6d:53:74:61:74:75:73:22:3a:30:2c:22:6c:6f:67:69:63:61:6c:52:65:67:69:6f:6e:4e:61:6d:65:22:3a:22:e4:b8:9c:e8:8e:9e:22:2c:22:61:7a:6f:6e:65:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:61:64:64:72:65:73:73:22:3a:22:38:2e:39:38:2e:31:33:32:2e:32:33:31:22:2c:22:6d:65:54:79:70:65:22:3a:6e:75:6c:6c:2c:22:6f:72:69:67:69:6e:53:79:73:74:65:6d:4e:61:6d:65:22:3a:22:52:4f:4d:41:43:6f:6e:6e:65:63:74:5f:73:6f:6c:75:74:69:6f:6e:2d:61:64:76:61:6e:63:65:2d:31:22:2c:22:72:65:73:50:6f:6f:6c:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:6f:72:69:67:69:6e:53:79:73:74:65:6d:54:79:70:65:22:3a:22:43:6c:6f:75:64:53:65:72:76:69:63:65:22:2c:22:61:6c:61:72:6d:47:72:6f:75:70:49:64:22:3a:22:32:37:38:35:36:31:35:33:32:22:2c:22:6d:61:74:63:68:4b:65:79:22:3a:22:66:35:31:63:35:38:62:33:2d:63:35:30:31:2d:34:37:33:33:2d:38:61:36:35:2d:65:36:37:63:35:33:63:38:37:62:38:33:22:2c:22:6d:61:6e:75:66:61:63:74:75:72:65:72:22:3a:22:68:75:61:77:65:69:22:2c:22:6c:6f:67:69:63:61:6c:52:65:67:69:6f:6e:49:64:22:3a:22:35:44:45:44:43:36:33:33:43:38:38:39:33:41:43:39:38:46:43:35:45:32:31:42:38:38:35:38:33:41:30:45:22:2c:22:72:65:61:73:6f:6e:49:64:22:3a:30:2c:22:64:63:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:64:6f:6d:61:69:6e:22:3a:6e:75:6c:6c:2c:22:72:75:6c:65:4e:61:6d:65:22:3a:22:5b:49:6e:74:65:72:6d:69:74:74:65:6e:74:2f:54:6f:67:67:6c:69:6e:67:20:41:6c:61:72:6d:20:48:61:6e:64:6c:69:6e:67:20:52:75:6c:65:5d:50:72:65:73:65:74:2d:49:6e:74:65:72:6d:69:74:74:65:6e:74:20:6f:72:20:54:6f:67:67:6c:69:6e:67:20:52:75:6c:65:20:66:6f:72:20:41:6c:6c:20:41:6c:61:72:6d:73:2c:20:5b:49:64:65:6e:74:69:66:69:63:61:74:69:6f:6e:20:52:75:6c:65:5d:75:70:67:72:61:64:65:5f:61:6c:61:72:6d:5f:69:64:65:6e:74:69:66:69:63:61:74:69:6f:6e:5f:72:75:6c:65:22:2c:22:63:6f:6d:6d:65:6e:74:22:3a:6e:75:6c:6c:2c:22:76:64:63:4e:61:6d:65:22:3a:6e:75:6c:6c:2c:22:6e:61:74:69:76:65:4d:65:44:6e:22:3a:22:30:36:35:66:38:66:36:65:2d:61:30:32:33:2d:34:63:61:65:2d:62:37:32:64:2d:61:31:34:34:39:39:38:35:62:65:61:38:22:2c:22:69:6e:76:61:6c:69:64:61:74:65:64:22:3a:30:2c:22:76:64:63:49:64:22:3a:6e:75:6c:6c:7d解码后:1.3.6.1.4.1.2011.2.15.2.4.3.3.39.0 = {"moc":"CLOUD_ROMA_INSTANCE","specialAlarmStatus":0,"logicalRegionName":"东莞","azoneName":null,"address":"8.98.132.231","meType":null,"originSystemName":"ROMAConnect_solution-advance-1","resPoolName":null,"originSystemType":"CloudService","alarmGroupId":"278561532","matchKey":"f51c58b3-c501-4733-8a65-e67c53c87b83","manufacturer":"huawei","logicalRegionId":"5DEDC633C8893AC98FC5E21B88583A0E","reasonId":0,"dcName":null,"domain":null,"ruleName":"[Intermittent/Toggling Alarm Handling Rule]Preset-Intermittent or Toggling Rule for All Alarms, [Identification Rule]upgrade_alarm_identification_rule","comment":null,"vdcName":null,"nativeMeDn":"065f8f6e-a023-4cae-b72d-a1449985bea8","invalidated":0,"vdcId":null}解码方式如下(以Java为例):1. 添加以下Maven依赖2. 解码代码:(完整使用场景可参考示例程序)//1.判断报文是否需要解码private boolean isHexString(String hex) { return Pattern.compile("^([a-zA-Z0-9]{2}:)+[a-zA-Z0-9]{2}$").matcher(hex).find();}//2.解码报文(编码需根据配置调整)private String hexStr2Str(String hexStr) { try { if (!StringUtils.isEmpty(hexStr)) { hexStr = hexStr.replace(":", ""); return new String(Hex.decodeHex(hexStr.toCharArray()), StandardCharsets.UTF_8); } } catch (Exception e) { LOGGER.error("hexStr2Str error : {}", e.getMessage()); } return hexStr;}
-
1、场景说明ManageOne运营侧支持新增菜单功能,部分客户需要新增菜单跳转到第三方系统,可以通过调用北向接口实现此功能。 2、使用流程约束条件:ManageOne 8.0.0 及以上版本准备工作:北向接口对接准备工作参考:cid:link_01、获取系统管理员Token,用户名和密码需要环境管理员提供,默认为vdc_adminPOST https://{IAM对外域名}/v3/auth/tokens Accept:application/json Content-Type:application/json;charset=UTF-8 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "vdc_admin", "password": "xxxxxx", "domain": { "name": "op_service" } } } }, "scope": { "domain": { "name": "op_service" } } }}2、调用北向接口新增菜单参数说明:名称说明key区分租户侧和管理侧,租户侧:custom_menu_vdc,管理侧:custom_menu_mgrtype一级菜单值为title,二级下拉菜单传数字,数值表示展示顺序text仅支持string格式,区分中英文菜单名称需传json格式的字符串租户侧新增菜单报文如下,header中需要携带Token:a)新增定制一级菜单注意:一级菜单作为功能分类说明,不能点击跳转,跳转链接功能在二级菜单上实现POST https://{ManageOne运营侧API对外域名}/silvan/rest/v1.0/links Accept:application/json X-Auth-Token:xxxxxxxxxxxxxxxxxxx Content-Type:application/json;charset=UTF-8 { "key": "custom_menu_vdc", "text": "{\"zh-cn\":\"百度\",\"en-us\":\"BaiDu\"}", "iconName": "list", "href": "", "type": "title", "domainType": "SC"}b)新增定制二级下拉菜单POST https://{ManageOne运营侧API对外域名}/silvan/rest/v1.0/links Accept:application/json X-Auth-Token:xxxxxxxxxxxxxxxxxxx Content-Type:application/json;charset=UTF-8 { "key": "custom_menu_vdc", "text": "{\"zh-cn\":\"百度\",\"en-us\":\"BaiDu\"}", "iconName": "list", "href": "https://www.baidu.com", "type": "1", "domainType": "SC"}效果如下: 注意:通常新增菜单后都希望点击能够直接进入第三方系统而不需再次输入用户名和密码登录,可配套单点登录定制能力使用,cid:link_13、调用北向接口删除菜单a)查询已经注册的链接GET https://{ManageOne运营侧API对外域名}/silvan/rest/v1.0/linksAccept:application/json X-Auth-Token:xxxxxxxxxxxxxxxxxxx Content-Type:application/json;charset=UTF-8 响应示例:{ "links": [ { "seqId": 626, "key": "custom_menu_vdc", "text": "{\"zh-cn\":\"百度\",\"en-us\":\"BaiDu\"}", "iconName": "list", "href": "https://www.baidu.com", "type": "1", "domainType": "SC", "regionId": "" } ...... ], "total": 521}b)删除已经注册的链接其中,{seq_id}从上面的响应结果中获取DELETE https://{ManageOne运营侧API对外域名}/silvan/rest/v1.0/links/{seq_id}Accept:application/json X-Auth-Token:xxxxxxxxxxxxxxxxxxxContent-Type:application/json;charset=UTF-8
-
1、场景说明ManageOne对接的各个云服务以离线话单的形式上报计量信息,然后ManageOne按照统一的规则解析得到计量数据,然后根据设置的计量因子单价,汇总计算得到最终的计费信息。第三方计费系统需要获取各云服务的计量信息时,可以通过直接获取离线话单的形式,离线话单为各云服务通过SFTP上传的文件,第三方计费系统获取文件后按照规则解析即可 2、使用流程 约束条件:ManageOne的离线话单文件会定时删除一个月前的数据,第三方需要在此期间内正确获取到全量的话单文件。不同的云服务具体解析规则不同,第三方需要严格按照规则解析文件获取计量数据。通过开发适配程序获取SFTP中离线话单文件,然后根据规则解析出每个云服务的计量数据,最后上报到第三方计费系统。示意图如下: 2.1获取文件所有云服务将话单文件上传到指定的SFTP目录。(/opt/meterfiles/uploads)所有云服务共用一个SFTP账号和密码,内部对接的云服务可以通过接口查询,第三方系统对接需要找管理员获取SFTP服务器IP、SFTP账户和密码信息。方法如下:需获取项获取方式服务器IP联系华为工程师,获取环境LLD导出表(FusionCloud安装工具FCD导出的环境详情),打开“2.1 工具生成的ip参数”工作表,搜索“ManageOne-Tenant-Float-IP”的参数值,即为SFTP服务器的IP地址。账户名称固定为"meteradmin"密码联系华为工程师,在support网站上下载"华为云Stack 8.x 帐户一览表"(与ManageOne版本配套),页签选择"B类(ManageOne)",在其中搜索"meteradmin",即可找到该用户的默认密码。2.2.解析话单从SFTP服务器获取的话单文件为zip格式,解压后最终文件为csv格式。注意:解压zip文件前需要校验文件完整性。话单文件最大为10M,如果超过容量会拆分多个文件。话单文件的名称带有时间戳,根据时间戳确定增量文件。如需查看详细解析规则,请登录后下载附件《华为 ManageOne 6.5.1-8.x 运营侧话单对接定制开发指南》。2.3.实例代码ManageOne提供示例代码供开发参考,该程序完成了以下功能:从SFTP服务器获取指定时间段内的话单文件将话单文件解析为类对象,并提供按各维度(项目id、规格等)筛选和统计的方法通过ManageOne北向接口获取vdc和项目间的关系,将最终的计量结果按vdc和规格的维度输出报表文件。项目地址:cid:link_0项目结构及介绍:输出样例:虚拟机计量报表:vm_meter.xls云硬盘计量报表:volume_meter.xls
上滑加载中
推荐直播
-
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中 -
华为云一键云上部署Openclaw 实现“龙虾自由”2026/04/11 周六 14:00-16:00
秦拳德-中软国际教育卓越研究院研究员
还在为搭建AI环境而焦头烂额、彻夜难眠? 还在苦苦等待复杂工具的缓慢响应、迟迟无法推进项目? 别再犹豫,快来华为云,一键部署OpenClaw,轻松告别 繁琐配置,即刻畅享极速体验!更有龙虾实操演示全程护 航,真正解放双手,让办公效率实现质的飞跃。限时重磅 福利火热来袭,干万Tokens等你来瓜分,机会难得,不容 错过!
即将直播
热门标签