有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 应用性能监控 > 最佳实践 > 将 APM 页面嵌入自建系统
APM 满足不需要登录腾讯云控制台即可查询分析 APM 数据的诉求。通过内嵌应用性能监控控制台页面,可以给用户带来以下方便:
在外部系统服务中(例如公司内部运维或运营系统)快速集成 APM 数据的查询分析能力。
无需管理众多腾讯云子账号,方便将 APM 数据分享给他人进行查看。
?
?

创建用户身份

企业用户(运维或开发人员)根据业务需求申请对应的权限,用户身份对应腾讯云账号角色,可以通过 控制台创建角色API 创建对应的角色:

通过控制台创建 CAM 角色

2. 单击左侧菜单栏中的角色,进入角色页面。
3. 选择新建角色 > 腾讯云账户,开始新建自定义角色。
4. 选择当前主账号并勾选允许当前角色服务控制台,单击下一步
?
?
5. 为角色设置访问策略,例如只读策略权限 QcloudAPMReadOnlyFullAccess,单击下一步
?
?
6. 输入角色名,完成创建。
?
?

通过 API 创建 CAM 角色

1. 获取当前用户的访问密钥,可参见 主账号访问密钥管理
2. 创建角色,详情请参见 创建角色 API ,其中 ConsoleLogin 需要填入1,允许角色登录控制台。
3. 绑定 QcloudAPMReadOnlyFullAccess 的权限策略到角色,详情参见 绑定权限策略到角色

获取用户身份访问密钥

根据角色名访问腾讯云 STS 服务,调用 AssumeRole 接口,申请角色 CompanyOpsRole 的临时密钥。
注意
设置中可能存在以下风险,请参考安全意见进行操作:
临时密钥有效期请勿设置过长,建议设置在 5 分钟以内,可通过 AssumeRole 参数 DurationSeconds 指定。
用户侧用于生成登录地址的系统需设置鉴权,例如内网身份校验,请勿设置成公开权限访问。

生成 APM 访问链接

生成签名串

1. 拼接参数。对要求签名的参数按照字母表或数字表递增顺序的排序,先考虑第一个字母,在相同的情况下考虑第二个字母,依此类推。
参数名称
必选
类型
描述
action
String
操作动作,固定为 roleLogin
timestamp
Int
当前时间戳
nonce
Int
随机整数,取值10000-100000000
secretId
String
STS 返回的临时 AK
拼凑参数示例:action=roleLogin&nonce=67439&secretId=AKI***PLE&timestamp=1484793352
2. 拼接签名串。按请求方法 + 请求主机 +请求路径 + ? + 请求字符串的规则拼接签名串。
参数
必选
描述
请求主机和路径
固定为 cloud.tencent.com/login/roleAccessCallback
请求方法
支持 GET 或 POST
拼接签名串示例:GETcloud.tencent.com/login/roleAccessCallback?action=roleLogin&nonce=67439&secretId=AKI***PLE&timestamp=1484793352
3. 生成签名串。使用 HMAC-SHA1 算法对字符串签名,目前支持 HMAC-SHA1 和 HMAC-SHA256,以Python 语言为例:
sts_secret_id = "AKI***PLE"
sts_secret_key = "IF***Wn3"
sig_str = 'GETcloud.tencent.com/login/roleAccessCallback?action=roleLogin&nonce=' + str(nonce) + '&secretId=' + sts_secret_id + '&timestamp=' + str(timestamp)
sign_str = base64.b64encode(hmac.new(bytes(sts_secret_key, encoding='utf-8'), bytes(sig_str, encoding='utf-8'), hashlib.sha1).digest())

拼凑最终访问链接

1. 获取 APM 控制台页面。 https://console.cloud.tencent.com/apm?rid=8&hideWidget=true&hideTopNav=true
URL 参数说明:
参数名称
必选
类型
描述
hideWidget
Boolean
是否隐藏智能客服图标:默认不隐藏,true 表示隐藏
hideTopNav
Boolean
是否隐藏腾讯云控制台顶部导航栏:默认不隐藏,true 表示隐藏
hideLeftNav
Boolean
是否隐藏腾讯云控制台左侧导航栏:默认不隐藏,true 表示隐藏
2. 拼接完整登录信息以及目的页地址进行登录,参数值需要 urlencode 编码。
/login/roleAccessCallback
?algorithm=<签名时加密算法,目前只支持 sha1 和 sha256 ,不填默认 sha1
&secretId=<签名时 secretId>
&token=<临时密钥 token>
&nonce=<签名时 nonce>
&timestamp=<签名时 timestamp>
&signature=<签名串>
&s_url=<登录后目的 URL>
3. 使用生成的最终链接,访问腾讯云 APM 控制台页面。
/login/roleAccessCallback?algorithm=sha1&secretId=AK***Lb&token=yXJYBcXqi***qPos_52PCpauvYykeiSpVZ7w5g2qOvV1Azs&nonce=67439&timestamp=1484793352&signature=AJ***3D&s_url=https%3A//console.cloud.tencent.com/apm%3FhideWidget%3Dtrue%26hideTopNav%3Dtrue

完整实例代码

python 语言完整实例代码:
import json
import random
import time
import base64
import hmac
import hashlib
from urllib.parse import quote
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.cam.v20190116 import cam_client, models as cam_models
from tencentcloud.sts.v20180813 import sts_client, models as sts_models
?
try:
role = "CompanyOpsRole"
uin = 100020507208
?
# 步骤一:创建角色
secret_id = "AK***NO"
secret_key = "lG***Zx"
cred = credential.Credential(secret_id, secret_key)
httpProfile = HttpProfile()
httpProfile.endpoint = "cam.tencentcloudapi.com"
?
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cam_client.CamClient(cred, "", clientProfile)
?
# 步骤二:创建 CAM 角色
req = cam_models.CreateRoleRequest()
params = {
"RoleName": role,
"PolicyDocument": "{\\"version\\":\\"2.0\\",\\"statement\\":[{\\"action\\":\\"name/sts:AssumeRole\\",\\"effect\\":\\"allow\\",\\"principal\\":{\\"qcs\\":[\\"qcs::cam::uin/" + str(
uin) + ":root\\"]}}]}",
"ConsoleLogin": 1
}
req.from_json_string(json.dumps(params))
client.CreateRole(req)
?
# 步骤三:绑定权限策略到角色
req = cam_models.AttachRolePolicyRequest()
params = {
"AttachRoleName": role,
"PolicyName": "QcloudAPMReadOnlyFullAccess"
}
req.from_json_string(json.dumps(params))
client.AttachRolePolicy(req)
?
# 步骤四:请求 AssumeRole
client = sts_client.StsClient(cred, "ap-shanghai")
req = sts_models.AssumeRoleRequest()
req.RoleArn = "qcs::cam::uin/" + str(uin) + ":roleName/" + role
req.RoleSessionName = "test"
resp = client.AssumeRole(req)
?
# 步骤五:生成签名串
sts_secret_id = resp.Credentials.TmpSecretId
sts_secret_key = resp.Credentials.TmpSecretKey
token = resp.Credentials.Token
nonce = random.randint(10000, 100000000)
timestamp = int(time.time())
?
sig_str = 'GETcloud.tencent.com/login/roleAccessCallback?action=roleLogin&nonce=' + str(
nonce) + '&secretId=' + sts_secret_id + '&timestamp=' + str(timestamp)
sign_str = base64.b64encode(
hmac.new(bytes(sts_secret_key, encoding='utf-8'), bytes(sig_str, encoding='utf-8'), hashlib.sha1).digest())
?
# 步骤六:拼凑最终访问链接
result = '/login/roleAccessCallback?algorithm=sha1&secretId=' + \\
quote(sts_secret_id) + '&token=' + quote(token) + '&nonce=' + str(nonce) + '&timestamp=' + str(
timestamp) + '&signature=' + quote(sign_str) + \\
'&s_url=' + quote('https://console.cloud.tencent.com/apm?hideWidget=true&hideTopNav=true')
print(result)
except TencentCloudSDKException as err:
print(err)
?


http://www.vxiaotou.com