{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2019-08-14-business-alarm","result":{"data":{"currentBlog":{"id":"ba972f16-ced0-5ef4-8d03-5dadcc85044c","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586850670017-%E5%B0%81%E9%9D%A2%E5%9B%BE%20%283%29.png","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-08-14T00:00:00.000Z","title":"如何用 Serverless 定制业务告警功能","description":"在使用云产品的时候，我们可能会需要一些业务告警，本文将告诉你如何快速做一个定制化的告警系统。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["业务告警","Serverless"],"keywords":"Serverless","outdated":null},"wordCount":{"words":128,"sentences":29,"paragraphs":29},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-14-business-alarm.md","fields":{"slug":"/blog/2019-08-14-business-alarm/","keywords":["java","php","serverless","云函数","param","lag","content"]},"html":"<p>尽管腾讯云提供了监控告警功能，但并不是「定制化」的。本文将会通过腾讯云云 API 对 Kafka 消息积压数量进行监控（在云监控部分并不提供这个指标的告警），当超过阈值时，通过 Email、企业微信和<a href=\"https://link.zhihu.com/?target=https%3A//cloud.tencent.com/product/sms%3Ffrom%3D9253\">短信</a>等进行业务告警。</p>\n<h2 id=\"▎云-api-对数据进行获取\"><a href=\"#%E2%96%8E%E4%BA%91-api-%E5%AF%B9%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E8%8E%B7%E5%8F%96\" aria-label=\"▎云 api 对数据进行获取 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎云 API 对数据进行获取</h2>\n<p>说到云 API 数据获取部分，非常推荐 Explorer。它能帮我们节省很多力气，本文也是通过 Explorer 来进行鉴权和监控数据获取的工作：</p>\n<p>鉴权部分（已去掉了个人 SecretId 和 Key，如果使用请自行添加，但是注意不要泄漏）：</p>\n<p>API 2.0 签名地址：<a href=\"https://link.zhihu.com/?target=https%3A//cloud.tencent.com/document/product/215/1693%3Ffrom%3D9253\">私有网络 签名方法</a></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"34346820567085600000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`def GetSignature(param):\n    # 公共参数\n    param[&quot;SecretId&quot;] = &quot;&quot;\n    param[&quot;Timestamp&quot;] = int(time.time())\n    param[&quot;Nonce&quot;] = random.randint(1, sys.maxsize)\n    param[&quot;Region&quot;] = &quot;ap-guangzhou&quot;\n    # param[&quot;SignatureMethod&quot;] = &quot;HmacSHA256&quot;\n\n    # 生成待签名字符串\n    sign_str = &quot;GETckafka.api.qcloud.com/v2/index.php?&quot;\n    sign_str += &quot;&&quot;.join(&quot;%s=%s&quot; % (k, param[k]) for k in sorted(param))\n\n    # 生成签名\n    secret_key = &quot;&quot;\n    if sys.version_info[0] > 2:\n        sign_str = bytes(sign_str, &quot;utf-8&quot;)\n        secret_key = bytes(secret_key, &quot;utf-8&quot;)\n    hashed = hmac.new(secret_key, sign_str, hashlib.sha1)\n    signature = binascii.b2a_base64(hashed.digest())[:-1]\n    if sys.version_info[0] > 2:\n        signature = signature.decode()\n\n    # 签名串编码\n    signature = urllib.parse.quote(signature)\n    return signature`, `34346820567085600000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">def <span class=\"token function\">GetSignature</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    # 公共参数\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"SecretId\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Timestamp\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Nonce\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> random<span class=\"token punctuation\">.</span><span class=\"token function\">randint</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">)</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Region\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"ap-guangzhou\"</span>\n    # param<span class=\"token punctuation\">[</span><span class=\"token string\">\"SignatureMethod\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"HmacSHA256\"</span>\n\n    # 生成待签名字符串\n    sign_str <span class=\"token operator\">=</span> <span class=\"token string\">\"GETckafka.api.qcloud.com/v2/index.php?\"</span>\n    sign_str <span class=\"token operator\">+=</span> <span class=\"token string\">\"&amp;\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%s=%s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">,</span> param<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token function\">sorted</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    # 生成签名\n    secret_key <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    <span class=\"token keyword\">if</span> sys<span class=\"token punctuation\">.</span>version_info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        sign_str <span class=\"token operator\">=</span> <span class=\"token function\">bytes</span><span class=\"token punctuation\">(</span>sign_str<span class=\"token punctuation\">,</span> <span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n        secret_key <span class=\"token operator\">=</span> <span class=\"token function\">bytes</span><span class=\"token punctuation\">(</span>secret_key<span class=\"token punctuation\">,</span> <span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    hashed <span class=\"token operator\">=</span> hmac<span class=\"token punctuation\">.</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span>secret_key<span class=\"token punctuation\">,</span> sign_str<span class=\"token punctuation\">,</span> hashlib<span class=\"token punctuation\">.</span>sha1<span class=\"token punctuation\">)</span>\n    signature <span class=\"token operator\">=</span> binascii<span class=\"token punctuation\">.</span><span class=\"token function\">b2a_base64</span><span class=\"token punctuation\">(</span>hashed<span class=\"token punctuation\">.</span><span class=\"token function\">digest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">if</span> sys<span class=\"token punctuation\">.</span>version_info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        signature <span class=\"token operator\">=</span> signature<span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    # 签名串编码\n    signature <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>parse<span class=\"token punctuation\">.</span><span class=\"token function\">quote</span><span class=\"token punctuation\">(</span>signature<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> signature</code></pre></div>\n<h2 id=\"▎获取-kafka-数据积压量\"><a href=\"#%E2%96%8E%E8%8E%B7%E5%8F%96-kafka-%E6%95%B0%E6%8D%AE%E7%A7%AF%E5%8E%8B%E9%87%8F\" aria-label=\"▎获取 kafka 数据积压量 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎获取 Kafka 数据积压量</h2>\n<p>Kafka 地址文档：<a href=\"https://link.zhihu.com/?target=https%3A//cloud.tencent.com/product/ckafka%3Ffrom%3D9253\">消息队列 CKafka</a></p>\n<p>获取积压数据的 API：<a href=\"https://link.zhihu.com/?target=https%3A//cloud.tencent.com/document/product/597/30030%3Ffrom%3D9253\">消息队列 CKafka 获取消费分组 offset</a></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"2758958981313997000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`def GetGroupOffsets(max_lag, phoneList):\n    param = {}\n    param[&quot;Action&quot;] = &quot;GetGroupOffsets&quot;\n    param[&quot;instanceId&quot;] = &quot;&quot;\n    param[&quot;group&quot;] = &quot;&quot;\n    signature = GetSignature(param)\n\n    # 生成请求地址\n    param[&quot;Signature&quot;] = signature\n    url = &quot;https://ckafka.api.qcloud.com/v2/index.php?Action=GetGroupOffsets&&quot;\n    url += &quot;&&quot;.join(&quot;%s=%s&quot; % (k, param[k]) for k in sorted(param))\n\n    req_attr = urllib.request.urlopen(url)\n    res_data = req_attr.read().decode(&quot;utf-8&quot;)\n    json_data = json.loads(res_data)\n\n    for eve_topic in json_data['data']['topicList']:\n        temp_lag = 0\n        result_list = []\n        for eve_partition in eve_topic[&quot;partitions&quot;]:\n            lag = eve_partition[&quot;lag&quot;]\n            temp_lag = temp_lag + lag\n\n        if temp_lag > max_lag:\n            result_list.append(\n                {\n                    &quot;topic&quot;: eve_topic[&quot;topic&quot;],\n                    &quot;lag&quot;: lag\n                }\n            )\n        \n        print(result_list)\n        if len(result_list)>0:\n            KafkaLagRobot(result_list)\n            KafkaLagSMS(result_list,phoneList)`, `2758958981313997000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">def <span class=\"token function\">GetGroupOffsets</span><span class=\"token punctuation\">(</span>max_lag<span class=\"token punctuation\">,</span> phoneList<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    param <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Action\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"GetGroupOffsets\"</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"instanceId\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"group\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    signature <span class=\"token operator\">=</span> <span class=\"token function\">GetSignature</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span>\n\n    # 生成请求地址\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Signature\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> signature\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"https://ckafka.api.qcloud.com/v2/index.php?Action=GetGroupOffsets&amp;\"</span>\n    url <span class=\"token operator\">+=</span> <span class=\"token string\">\"&amp;\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%s=%s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">,</span> param<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token function\">sorted</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    req_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">urlopen</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n    res_data <span class=\"token operator\">=</span> req_attr<span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    json_data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">loads</span><span class=\"token punctuation\">(</span>res_data<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">for</span> eve_topic <span class=\"token keyword\">in</span> json_data<span class=\"token punctuation\">[</span><span class=\"token string\">'data'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'topicList'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n        temp_lag <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        result_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> eve_partition <span class=\"token keyword\">in</span> eve_topic<span class=\"token punctuation\">[</span><span class=\"token string\">\"partitions\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            lag <span class=\"token operator\">=</span> eve_partition<span class=\"token punctuation\">[</span><span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">]</span>\n            temp_lag <span class=\"token operator\">=</span> temp_lag <span class=\"token operator\">+</span> lag\n\n        <span class=\"token keyword\">if</span> temp_lag <span class=\"token operator\">></span> max_lag<span class=\"token punctuation\">:</span>\n            result_list<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span>\n                <span class=\"token punctuation\">{</span>\n                    <span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">:</span> eve_topic<span class=\"token punctuation\">[</span><span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">:</span> lag\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">)</span>\n        \n        <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> <span class=\"token function\">len</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span><span class=\"token operator\">></span><span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            <span class=\"token function\">KafkaLagRobot</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span>\n            <span class=\"token function\">KafkaLagSMS</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">,</span>phoneList<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"▎接入企业微信\"><a href=\"#%E2%96%8E%E6%8E%A5%E5%85%A5%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1\" aria-label=\"▎接入企业微信 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎接入企业微信</h2>\n<p>先贴一个企业微信机器人地址：<a href=\"https://link.zhihu.com/?target=https%3A//work.weixin.qq.com/api/doc%23search\">https://work.weixin.qq.com/api/doc#search</a></p>\n<p>通过企业微信机器人配置，可以获得一个 Webhook，编写告警代码：</p>\n<p>（已删除企业微信的 webhook，请自行添加到 url 中）</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"3987224564623015400\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`def KafkaLagRobot(content):\n\n    url = &quot;&quot;\n    data = {\n        &quot;msgtype&quot;: &quot;markdown&quot;,\n        &quot;markdown&quot;: {\n            &quot;content&quot;: content,\n        }\n    }\n    data = str(json.dumps(data)).encode(&quot;utf-8&quot;)\n    print(urllib.request.urlopen(urllib.request.Request(url, data)).read().decode(&quot;utf-8&quot;))`, `3987224564623015400`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">def <span class=\"token function\">KafkaLagRobot</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"msgtype\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> content<span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> <span class=\"token function\">str</span><span class=\"token punctuation\">(</span>json<span class=\"token punctuation\">.</span><span class=\"token function\">dumps</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">urlopen</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">Request</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"▎接入腾讯云短信服务\"><a href=\"#%E2%96%8E%E6%8E%A5%E5%85%A5%E8%85%BE%E8%AE%AF%E4%BA%91%E7%9F%AD%E4%BF%A1%E6%9C%8D%E5%8A%A1\" aria-label=\"▎接入腾讯云短信服务 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎接入腾讯云短信服务</h2>\n<p>已脱敏。短信页面地址：<a href=\"https://link.zhihu.com/?target=https%3A//cloud.tencent.com/product/sms%3Ffrom%3D9253\">短信 SMS</a></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"55244928373305795000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`def KafkaLagSMS(infor, phone_list):\n\n    random_data = random.randint(1, sys.maxsize)\n    url = &quot;&quot;\n    strMobile = phone_list\n    strAppKey = &quot;&quot;\n    strRand = str(random_data)\n    strTime = int(time.time())\n    sig = hashlib.sha256()\n    sig.update(\n        (&quot;appkey=%s&random=%s&time=%s&mobile=%s&quot; % (strAppKey, random_data, strTime, &quot;,&quot;.join(strMobile))).encode(\n            &quot;utf-8&quot;))\n\n    phone_dict = []\n    for eve_phone in phone_list:\n        phone_dict.append(\n            {\n                &quot;mobile&quot;: eve_phone,\n                &quot;nationcode&quot;: &quot;86&quot;\n            }\n        )\n\n    data = {\n        &quot;ext&quot;: &quot;&quot;,\n        &quot;extend&quot;: &quot;&quot;,\n        &quot;params&quot;: [\n            infor,\n        ],\n        &quot;sig&quot;: sig.hexdigest(),\n        &quot;sign&quot;: &quot;你的sign&quot;,\n        &quot;tel&quot;: phone_dict,\n        &quot;time&quot;: strTime,\n        &quot;tpl_id&quot;: 你的模板id\n    }\n    data = str(json.dumps(data)).encode(&quot;utf-8&quot;)\n    print(urllib.request.urlopen(urllib.request.Request(url=url, data=data)).read().decode(&quot;utf-8&quot;))`, `55244928373305795000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">def <span class=\"token function\">KafkaLagSMS</span><span class=\"token punctuation\">(</span>infor<span class=\"token punctuation\">,</span> phone_list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    random_data <span class=\"token operator\">=</span> random<span class=\"token punctuation\">.</span><span class=\"token function\">randint</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">)</span>\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    strMobile <span class=\"token operator\">=</span> phone_list\n    strAppKey <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    strRand <span class=\"token operator\">=</span> <span class=\"token function\">str</span><span class=\"token punctuation\">(</span>random_data<span class=\"token punctuation\">)</span>\n    strTime <span class=\"token operator\">=</span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    sig <span class=\"token operator\">=</span> hashlib<span class=\"token punctuation\">.</span><span class=\"token function\">sha256</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    sig<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span>\n        <span class=\"token punctuation\">(</span><span class=\"token string\">\"appkey=%s&amp;random=%s&amp;time=%s&amp;mobile=%s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>strAppKey<span class=\"token punctuation\">,</span> random_data<span class=\"token punctuation\">,</span> strTime<span class=\"token punctuation\">,</span> <span class=\"token string\">\",\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>strMobile<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    phone_dict <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> eve_phone <span class=\"token keyword\">in</span> phone_list<span class=\"token punctuation\">:</span>\n        phone_dict<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span>\n            <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"mobile\"</span><span class=\"token punctuation\">:</span> eve_phone<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"nationcode\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"86\"</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">)</span>\n\n    data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"ext\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"extend\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"params\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n            infor<span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"sig\"</span><span class=\"token punctuation\">:</span> sig<span class=\"token punctuation\">.</span><span class=\"token function\">hexdigest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"sign\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"你的sign\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"tel\"</span><span class=\"token punctuation\">:</span> phone_dict<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"time\"</span><span class=\"token punctuation\">:</span> strTime<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"tpl_id\"</span><span class=\"token punctuation\">:</span> 你的模板id\n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> <span class=\"token function\">str</span><span class=\"token punctuation\">(</span>json<span class=\"token punctuation\">.</span><span class=\"token function\">dumps</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">urlopen</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">Request</span><span class=\"token punctuation\">(</span>url<span class=\"token operator\">=</span>url<span class=\"token punctuation\">,</span> data<span class=\"token operator\">=</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"▎发送邮件告警\"><a href=\"#%E2%96%8E%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E5%91%8A%E8%AD%A6\" aria-label=\"▎发送邮件告警 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎发送邮件告警</h2>\n<p>可参考之前的 Demo：<a href=\"https://zhuanlan.zhihu.com/p/83025871\">「实践」网站监控脚本的实现</a></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"73664685991252910000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`def sendEmail(content, to_user):\n    sender = 'service@anycodes.cn'\n    receivers = [to_user]\n\n    mail_msg = content\n    message = MIMEText(mail_msg, 'html', 'utf-8')\n    message['From'] = Header(&quot;监控&quot;, 'utf-8')\n    message['To'] = Header(&quot;站长&quot;, 'utf-8')\n\n    subject = &quot;告警&quot;\n    message['Subject'] = Header(subject, 'utf-8')\n\n    try:\n        smtpObj = smtplib.SMTP_SSL(&quot;smtp.exmail.qq.com&quot;, 465)\n        smtpObj.login('service@anycodes.cn', '密码')\n        smtpObj.sendmail(sender, receivers, message.as_string())\n    except smtplib.SMTPException:\n        pass`, `73664685991252910000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">def <span class=\"token function\">sendEmail</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">,</span> to_user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    sender <span class=\"token operator\">=</span> <span class=\"token string\">'service@anycodes.cn'</span>\n    receivers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>to_user<span class=\"token punctuation\">]</span>\n\n    mail_msg <span class=\"token operator\">=</span> content\n    message <span class=\"token operator\">=</span> <span class=\"token function\">MIMEText</span><span class=\"token punctuation\">(</span>mail_msg<span class=\"token punctuation\">,</span> <span class=\"token string\">'html'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n    message<span class=\"token punctuation\">[</span><span class=\"token string\">'From'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">Header</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"监控\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n    message<span class=\"token punctuation\">[</span><span class=\"token string\">'To'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">Header</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"站长\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n\n    subject <span class=\"token operator\">=</span> <span class=\"token string\">\"告警\"</span>\n    message<span class=\"token punctuation\">[</span><span class=\"token string\">'Subject'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">Header</span><span class=\"token punctuation\">(</span>subject<span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n        smtpObj <span class=\"token operator\">=</span> smtplib<span class=\"token punctuation\">.</span><span class=\"token constant\">SMTP_SSL</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"smtp.exmail.qq.com\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">465</span><span class=\"token punctuation\">)</span>\n        smtpObj<span class=\"token punctuation\">.</span><span class=\"token function\">login</span><span class=\"token punctuation\">(</span><span class=\"token string\">'service@anycodes.cn'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'密码'</span><span class=\"token punctuation\">)</span>\n        smtpObj<span class=\"token punctuation\">.</span><span class=\"token function\">sendmail</span><span class=\"token punctuation\">(</span>sender<span class=\"token punctuation\">,</span> receivers<span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">.</span><span class=\"token function\">as_string</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    except smtplib<span class=\"token punctuation\">.</span>SMTPException<span class=\"token punctuation\">:</span>\n        pass</code></pre></div>\n<h2 id=\"▎整合代码\"><a href=\"#%E2%96%8E%E6%95%B4%E5%90%88%E4%BB%A3%E7%A0%81\" aria-label=\"▎整合代码 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎整合代码</h2>\n<p>通过一些逻辑整合所有代码即可：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"17579030989813040000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# -*- coding: utf8 -*-\nimport json\nimport binascii\nimport hashlib\nimport hmac\nimport random\nimport sys\nimport ssl\nimport time\nimport urllib.parse\nimport urllib.request\nimport smtplib\nfrom email.mime.text import MIMEText\nfrom email.header import Header\nssl._create_default_https_context = ssl._create_unverified_context\n\ndef sendEmail(infor):\n\n    temp_str = 'Topic:%s，积压数据量:%d；'\n    content = &quot;&quot;\n    for eve_infor in infor:\n        content = content + temp_str % (eve_infor[&quot;topic&quot;], eve_infor[&quot;lag&quot;])\n\n    sender = 'service@anycodes.cn'\n    receivers = [&quot;service@anycodes.cn&quot;]\n\n    mail_msg = content\n    message = MIMEText(mail_msg, 'html', 'utf-8')\n    message['From'] = Header(&quot;监控&quot;, 'utf-8')\n    message['To'] = Header(&quot;站长&quot;, 'utf-8')\n\n    subject = &quot;告警&quot;\n    message['Subject'] = Header(subject, 'utf-8')\n\n    try:\n        smtpObj = smtplib.SMTP_SSL(&quot;smtp.exmail.qq.com&quot;, 465)\n        smtpObj.login('service@anycodes.cn', '密码')\n        smtpObj.sendmail(sender, receivers, message.as_string())\n    except smtplib.SMTPException:\n        pass\n\ndef KafkaLagRobot(infor):\n    base_str = &quot;Kafka消费者监控提醒：\\n&quot;\n    temp_str = '>Topic:<font color=&quot;comment&quot;>%s</font>，积压数据量:<font color=&quot;warning&quot;>%d</font>条；\\n'\n    content = &quot;&quot;\n    for eve_infor in infor:\n        content = content + temp_str % (eve_infor[&quot;topic&quot;], eve_infor[&quot;lag&quot;])\n\n    content = base_str + content\n\n    url = &quot;&quot;\n    data = {\n        &quot;msgtype&quot;: &quot;markdown&quot;,\n        &quot;markdown&quot;: {\n            &quot;content&quot;: content,\n        }\n    }\n    data = str(json.dumps(data)).encode(&quot;utf-8&quot;)\n    print(urllib.request.urlopen(urllib.request.Request(url, data)).read().decode(&quot;utf-8&quot;))\n\n\ndef KafkaLagSMS(infor, phone_list):\n\n    temp_str = 'Topic:%s，积压数据量:%d；'\n    content = &quot;&quot;\n    for eve_infor in infor:\n        content = content + temp_str % (eve_infor[&quot;topic&quot;], eve_infor[&quot;lag&quot;])\n\n    random_data = random.randint(1, sys.maxsize)\n    url = &quot;&quot;\n    strMobile = phone_list\n    strAppKey = &quot;&quot;\n    strRand = str(random_data)\n    strTime = int(time.time())\n    sig = hashlib.sha256()\n    sig.update(\n        (&quot;appkey=%s&random=%s&time=%s&mobile=%s&quot; % (strAppKey, random_data, strTime, &quot;,&quot;.join(strMobile))).encode(\n            &quot;utf-8&quot;))\n\n    phone_dict = []\n    for eve_phone in phone_list:\n        phone_dict.append(\n            {\n                &quot;mobile&quot;: eve_phone,\n                &quot;nationcode&quot;: &quot;86&quot;\n            }\n        )\n\n    data = {\n        &quot;ext&quot;: &quot;&quot;,\n        &quot;extend&quot;: &quot;&quot;,\n        &quot;params&quot;: [\n            content,\n        ],\n        &quot;sig&quot;: sig.hexdigest(),\n        &quot;sign&quot;: &quot;&quot;,\n        &quot;tel&quot;: phone_dict,\n        &quot;time&quot;: strTime,\n        &quot;tpl_id&quot;: \n    }\n    data = str(json.dumps(data)).encode(&quot;utf-8&quot;)\n    print(urllib.request.urlopen(urllib.request.Request(url=url, data=data)).read().decode(&quot;utf-8&quot;))\n\n\ndef GetSignature(param):\n    # 公共参数\n    param[&quot;SecretId&quot;] = &quot;&quot;\n    param[&quot;Timestamp&quot;] = int(time.time())\n    param[&quot;Nonce&quot;] = random.randint(1, sys.maxsize)\n    param[&quot;Region&quot;] = &quot;ap-guangzhou&quot;\n    # param[&quot;SignatureMethod&quot;] = &quot;HmacSHA256&quot;\n\n    # 生成待签名字符串\n    sign_str = &quot;GETckafka.api.qcloud.com/v2/index.php?&quot;\n    sign_str += &quot;&&quot;.join(&quot;%s=%s&quot; % (k, param[k]) for k in sorted(param))\n\n    # 生成签名\n    secret_key = &quot;&quot;\n    if sys.version_info[0] > 2:\n        sign_str = bytes(sign_str, &quot;utf-8&quot;)\n        secret_key = bytes(secret_key, &quot;utf-8&quot;)\n    hashed = hmac.new(secret_key, sign_str, hashlib.sha1)\n    signature = binascii.b2a_base64(hashed.digest())[:-1]\n    if sys.version_info[0] > 2:\n        signature = signature.decode()\n\n    # 签名串编码\n    signature = urllib.parse.quote(signature)\n    return signature\n\n\ndef GetGroupOffsets(max_lag, phoneList):\n    param = {}\n    param[&quot;Action&quot;] = &quot;GetGroupOffsets&quot;\n    param[&quot;instanceId&quot;] = &quot;&quot;\n    param[&quot;group&quot;] = &quot;&quot;\n    signature = GetSignature(param)\n\n    # 生成请求地址\n    param[&quot;Signature&quot;] = signature\n    url = &quot;https://ckafka.api.qcloud.com/v2/index.php?Action=GetGroupOffsets&&quot;\n    url += &quot;&&quot;.join(&quot;%s=%s&quot; % (k, param[k]) for k in sorted(param))\n\n    req_attr = urllib.request.urlopen(url)\n    res_data = req_attr.read().decode(&quot;utf-8&quot;)\n    json_data = json.loads(res_data)\n\n    for eve_topic in json_data['data']['topicList']:\n        temp_lag = 0\n        result_list = []\n        for eve_partition in eve_topic[&quot;partitions&quot;]:\n            lag = eve_partition[&quot;lag&quot;]\n            temp_lag = temp_lag + lag\n\n        if temp_lag > max_lag:\n            result_list.append(\n                {\n                    &quot;topic&quot;: eve_topic[&quot;topic&quot;],\n                    &quot;lag&quot;: lag\n                }\n            )\n        \n        print(result_list)\n        if len(result_list)>0:\n            KafkaLagRobot(result_list)\n            KafkaLagSMS(result_list,phoneList)\n            sendEmail(result_list)\n\ndef main_handler(event, context):\n    # 发送短信的列表\n    phone_list = [&quot;PhoneNumber&quot;]\n    GetGroupOffsets(2000, phone_list)\n    return True`, `17579030989813040000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"># <span class=\"token operator\">-</span><span class=\"token operator\">*</span><span class=\"token operator\">-</span> coding<span class=\"token punctuation\">:</span> utf8 <span class=\"token operator\">-</span><span class=\"token operator\">*</span><span class=\"token operator\">-</span>\n<span class=\"token keyword\">import</span> json\n<span class=\"token keyword\">import</span> binascii\n<span class=\"token keyword\">import</span> hashlib\n<span class=\"token keyword\">import</span> hmac\n<span class=\"token keyword\">import</span> random\n<span class=\"token keyword\">import</span> sys\n<span class=\"token keyword\">import</span> ssl\n<span class=\"token keyword\">import</span> time\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>parse\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>request\n<span class=\"token keyword\">import</span> smtplib\n<span class=\"token keyword\">from</span> email<span class=\"token punctuation\">.</span>mime<span class=\"token punctuation\">.</span>text <span class=\"token keyword\">import</span> MIMEText\n<span class=\"token keyword\">from</span> email<span class=\"token punctuation\">.</span>header <span class=\"token keyword\">import</span> Header\nssl<span class=\"token punctuation\">.</span>_create_default_https_context <span class=\"token operator\">=</span> ssl<span class=\"token punctuation\">.</span>_create_unverified_context\n\ndef <span class=\"token function\">sendEmail</span><span class=\"token punctuation\">(</span>infor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    temp_str <span class=\"token operator\">=</span> <span class=\"token string\">'Topic:%s，积压数据量:%d；'</span>\n    content <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    <span class=\"token keyword\">for</span> eve_infor <span class=\"token keyword\">in</span> infor<span class=\"token punctuation\">:</span>\n        content <span class=\"token operator\">=</span> content <span class=\"token operator\">+</span> temp_str <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>eve_infor<span class=\"token punctuation\">[</span><span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> eve_infor<span class=\"token punctuation\">[</span><span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    sender <span class=\"token operator\">=</span> <span class=\"token string\">'service@anycodes.cn'</span>\n    receivers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"service@anycodes.cn\"</span><span class=\"token punctuation\">]</span>\n\n    mail_msg <span class=\"token operator\">=</span> content\n    message <span class=\"token operator\">=</span> <span class=\"token function\">MIMEText</span><span class=\"token punctuation\">(</span>mail_msg<span class=\"token punctuation\">,</span> <span class=\"token string\">'html'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n    message<span class=\"token punctuation\">[</span><span class=\"token string\">'From'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">Header</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"监控\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n    message<span class=\"token punctuation\">[</span><span class=\"token string\">'To'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">Header</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"站长\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n\n    subject <span class=\"token operator\">=</span> <span class=\"token string\">\"告警\"</span>\n    message<span class=\"token punctuation\">[</span><span class=\"token string\">'Subject'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">Header</span><span class=\"token punctuation\">(</span>subject<span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n        smtpObj <span class=\"token operator\">=</span> smtplib<span class=\"token punctuation\">.</span><span class=\"token constant\">SMTP_SSL</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"smtp.exmail.qq.com\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">465</span><span class=\"token punctuation\">)</span>\n        smtpObj<span class=\"token punctuation\">.</span><span class=\"token function\">login</span><span class=\"token punctuation\">(</span><span class=\"token string\">'service@anycodes.cn'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'密码'</span><span class=\"token punctuation\">)</span>\n        smtpObj<span class=\"token punctuation\">.</span><span class=\"token function\">sendmail</span><span class=\"token punctuation\">(</span>sender<span class=\"token punctuation\">,</span> receivers<span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">.</span><span class=\"token function\">as_string</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    except smtplib<span class=\"token punctuation\">.</span>SMTPException<span class=\"token punctuation\">:</span>\n        pass\n\ndef <span class=\"token function\">KafkaLagRobot</span><span class=\"token punctuation\">(</span>infor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    base_str <span class=\"token operator\">=</span> <span class=\"token string\">\"Kafka消费者监控提醒：\\n\"</span>\n    temp_str <span class=\"token operator\">=</span> <span class=\"token string\">'>Topic:&lt;font color=\"comment\">%s&lt;/font>，积压数据量:&lt;font color=\"warning\">%d&lt;/font>条；\\n'</span>\n    content <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    <span class=\"token keyword\">for</span> eve_infor <span class=\"token keyword\">in</span> infor<span class=\"token punctuation\">:</span>\n        content <span class=\"token operator\">=</span> content <span class=\"token operator\">+</span> temp_str <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>eve_infor<span class=\"token punctuation\">[</span><span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> eve_infor<span class=\"token punctuation\">[</span><span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    content <span class=\"token operator\">=</span> base_str <span class=\"token operator\">+</span> content\n\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"msgtype\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> content<span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> <span class=\"token function\">str</span><span class=\"token punctuation\">(</span>json<span class=\"token punctuation\">.</span><span class=\"token function\">dumps</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">urlopen</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">Request</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n\ndef <span class=\"token function\">KafkaLagSMS</span><span class=\"token punctuation\">(</span>infor<span class=\"token punctuation\">,</span> phone_list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    temp_str <span class=\"token operator\">=</span> <span class=\"token string\">'Topic:%s，积压数据量:%d；'</span>\n    content <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    <span class=\"token keyword\">for</span> eve_infor <span class=\"token keyword\">in</span> infor<span class=\"token punctuation\">:</span>\n        content <span class=\"token operator\">=</span> content <span class=\"token operator\">+</span> temp_str <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>eve_infor<span class=\"token punctuation\">[</span><span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> eve_infor<span class=\"token punctuation\">[</span><span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    random_data <span class=\"token operator\">=</span> random<span class=\"token punctuation\">.</span><span class=\"token function\">randint</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">)</span>\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    strMobile <span class=\"token operator\">=</span> phone_list\n    strAppKey <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    strRand <span class=\"token operator\">=</span> <span class=\"token function\">str</span><span class=\"token punctuation\">(</span>random_data<span class=\"token punctuation\">)</span>\n    strTime <span class=\"token operator\">=</span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    sig <span class=\"token operator\">=</span> hashlib<span class=\"token punctuation\">.</span><span class=\"token function\">sha256</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    sig<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span>\n        <span class=\"token punctuation\">(</span><span class=\"token string\">\"appkey=%s&amp;random=%s&amp;time=%s&amp;mobile=%s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>strAppKey<span class=\"token punctuation\">,</span> random_data<span class=\"token punctuation\">,</span> strTime<span class=\"token punctuation\">,</span> <span class=\"token string\">\",\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>strMobile<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    phone_dict <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> eve_phone <span class=\"token keyword\">in</span> phone_list<span class=\"token punctuation\">:</span>\n        phone_dict<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span>\n            <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"mobile\"</span><span class=\"token punctuation\">:</span> eve_phone<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"nationcode\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"86\"</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">)</span>\n\n    data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"ext\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"extend\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"params\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n            content<span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"sig\"</span><span class=\"token punctuation\">:</span> sig<span class=\"token punctuation\">.</span><span class=\"token function\">hexdigest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"sign\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"tel\"</span><span class=\"token punctuation\">:</span> phone_dict<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"time\"</span><span class=\"token punctuation\">:</span> strTime<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"tpl_id\"</span><span class=\"token punctuation\">:</span> \n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> <span class=\"token function\">str</span><span class=\"token punctuation\">(</span>json<span class=\"token punctuation\">.</span><span class=\"token function\">dumps</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">urlopen</span><span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">Request</span><span class=\"token punctuation\">(</span>url<span class=\"token operator\">=</span>url<span class=\"token punctuation\">,</span> data<span class=\"token operator\">=</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n\ndef <span class=\"token function\">GetSignature</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    # 公共参数\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"SecretId\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Timestamp\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">int</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Nonce\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> random<span class=\"token punctuation\">.</span><span class=\"token function\">randint</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">)</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Region\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"ap-guangzhou\"</span>\n    # param<span class=\"token punctuation\">[</span><span class=\"token string\">\"SignatureMethod\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"HmacSHA256\"</span>\n\n    # 生成待签名字符串\n    sign_str <span class=\"token operator\">=</span> <span class=\"token string\">\"GETckafka.api.qcloud.com/v2/index.php?\"</span>\n    sign_str <span class=\"token operator\">+=</span> <span class=\"token string\">\"&amp;\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%s=%s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">,</span> param<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token function\">sorted</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    # 生成签名\n    secret_key <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    <span class=\"token keyword\">if</span> sys<span class=\"token punctuation\">.</span>version_info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        sign_str <span class=\"token operator\">=</span> <span class=\"token function\">bytes</span><span class=\"token punctuation\">(</span>sign_str<span class=\"token punctuation\">,</span> <span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n        secret_key <span class=\"token operator\">=</span> <span class=\"token function\">bytes</span><span class=\"token punctuation\">(</span>secret_key<span class=\"token punctuation\">,</span> <span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    hashed <span class=\"token operator\">=</span> hmac<span class=\"token punctuation\">.</span><span class=\"token function\">new</span><span class=\"token punctuation\">(</span>secret_key<span class=\"token punctuation\">,</span> sign_str<span class=\"token punctuation\">,</span> hashlib<span class=\"token punctuation\">.</span>sha1<span class=\"token punctuation\">)</span>\n    signature <span class=\"token operator\">=</span> binascii<span class=\"token punctuation\">.</span><span class=\"token function\">b2a_base64</span><span class=\"token punctuation\">(</span>hashed<span class=\"token punctuation\">.</span><span class=\"token function\">digest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">if</span> sys<span class=\"token punctuation\">.</span>version_info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        signature <span class=\"token operator\">=</span> signature<span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    # 签名串编码\n    signature <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>parse<span class=\"token punctuation\">.</span><span class=\"token function\">quote</span><span class=\"token punctuation\">(</span>signature<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> signature\n\n\ndef <span class=\"token function\">GetGroupOffsets</span><span class=\"token punctuation\">(</span>max_lag<span class=\"token punctuation\">,</span> phoneList<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    param <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Action\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"GetGroupOffsets\"</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"instanceId\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"group\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    signature <span class=\"token operator\">=</span> <span class=\"token function\">GetSignature</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span>\n\n    # 生成请求地址\n    param<span class=\"token punctuation\">[</span><span class=\"token string\">\"Signature\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> signature\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"https://ckafka.api.qcloud.com/v2/index.php?Action=GetGroupOffsets&amp;\"</span>\n    url <span class=\"token operator\">+=</span> <span class=\"token string\">\"&amp;\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"%s=%s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">,</span> param<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token function\">sorted</span><span class=\"token punctuation\">(</span>param<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    req_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span><span class=\"token function\">urlopen</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n    res_data <span class=\"token operator\">=</span> req_attr<span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    json_data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">loads</span><span class=\"token punctuation\">(</span>res_data<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">for</span> eve_topic <span class=\"token keyword\">in</span> json_data<span class=\"token punctuation\">[</span><span class=\"token string\">'data'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'topicList'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n        temp_lag <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        result_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> eve_partition <span class=\"token keyword\">in</span> eve_topic<span class=\"token punctuation\">[</span><span class=\"token string\">\"partitions\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            lag <span class=\"token operator\">=</span> eve_partition<span class=\"token punctuation\">[</span><span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">]</span>\n            temp_lag <span class=\"token operator\">=</span> temp_lag <span class=\"token operator\">+</span> lag\n\n        <span class=\"token keyword\">if</span> temp_lag <span class=\"token operator\">></span> max_lag<span class=\"token punctuation\">:</span>\n            result_list<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span>\n                <span class=\"token punctuation\">{</span>\n                    <span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">:</span> eve_topic<span class=\"token punctuation\">[</span><span class=\"token string\">\"topic\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"lag\"</span><span class=\"token punctuation\">:</span> lag\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">)</span>\n        \n        <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> <span class=\"token function\">len</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span><span class=\"token operator\">></span><span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            <span class=\"token function\">KafkaLagRobot</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span>\n            <span class=\"token function\">KafkaLagSMS</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">,</span>phoneList<span class=\"token punctuation\">)</span>\n            <span class=\"token function\">sendEmail</span><span class=\"token punctuation\">(</span>result_list<span class=\"token punctuation\">)</span>\n\ndef <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    # 发送短信的列表\n    phone_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"PhoneNumber\"</span><span class=\"token punctuation\">]</span>\n    <span class=\"token function\">GetGroupOffsets</span><span class=\"token punctuation\">(</span><span class=\"token number\">2000</span><span class=\"token punctuation\">,</span> phone_list<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> True</code></pre></div>\n<h2 id=\"▎总结\"><a href=\"#%E2%96%8E%E6%80%BB%E7%BB%93\" aria-label=\"▎总结 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>▎总结</h2>\n<p>本文主要通过云 API 对云监控数据进行获取，从而得到 Kafka 数据的积压量，进行一个逻辑处理，然后调用了发送邮件、企业微信和短信的方法，实现了监控告警功能。</p>\n<p>经过使用时间触发器，效果良好，也成功实现了基本告警功能。</p>\n<p><img src=\"https://img.serverlesscloud.cn/tmp/v2-7c335d92d5474175ebd4c7ce9a10c90f_1440w.png\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/tmp/v2-0f4bd86130c0a5184b3fde2c08dd380d_1440w-20200414185748496.jpg\"></p>\n<p>不难看出，腾讯云云函数 SCF 是一个非常有趣，而且有价值的产品。</p>\n<p>比如说，用户的某个项目，需要临时加一个模块，可以直接通过 SCF 对数据库进行增删改查，增加点逻辑代码，与 <a href=\"https://link.zhihu.com/?target=https%3A//cloud.tencent.com/product/apigateway%3Ffrom%3D9253\">API 网关</a>结合，便能很快上线，而不用繁琐地修改源代码，开发过程非常愉快。</p>\n<p>正确地应用一款产品，或者结合几个产品灵活使用，能让开发者事半功倍。</p>\n<hr>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a> </li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E4%BA%91-api-%E5%AF%B9%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E8%8E%B7%E5%8F%96\">▎云 API 对数据进行获取</a></li>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E8%8E%B7%E5%8F%96-kafka-%E6%95%B0%E6%8D%AE%E7%A7%AF%E5%8E%8B%E9%87%8F\">▎获取 Kafka 数据积压量</a></li>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E6%8E%A5%E5%85%A5%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1\">▎接入企业微信</a></li>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E6%8E%A5%E5%85%A5%E8%85%BE%E8%AE%AF%E4%BA%91%E7%9F%AD%E4%BF%A1%E6%9C%8D%E5%8A%A1\">▎接入腾讯云短信服务</a></li>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E5%91%8A%E8%AD%A6\">▎发送邮件告警</a></li>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E6%95%B4%E5%90%88%E4%BB%A3%E7%A0%81\">▎整合代码</a></li>\n<li><a href=\"/blog/2019-08-14-business-alarm/#%E2%96%8E%E6%80%BB%E7%BB%93\">▎总结</a></li>\n</ul>"},"previousBlog":{"id":"5a1206f0-492f-5446-a4fb-396fc2334b8f","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586850472107-%E5%B0%81%E9%9D%A2%E5%9B%BE%20%282%29.png","authors":["serverless 社区"],"categories":["news"],"date":"2019-08-19T00:00:00.000Z","title":"从概念到实践，开发者如何更好地了解 Serverless","description":"本文整理了 Hello Serverless 深圳站的精选内容","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["概念实践","Serverless"],"keywords":"Serverless","outdated":null},"wordCount":{"words":376,"sentences":64,"paragraphs":64},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-19-hellosls.md","fields":{"slug":"/blog/2019-08-19-hellosls/","keywords":["serverless","函数计算","无服务器","云函数","Serverless","开发者","腾讯","函数","监控","serverlesscloud","业务"]}},"nextBlog":{"id":"22c72191-2b2a-5d57-8a0c-aa1616ee296c","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586850758698-%E5%B0%81%E9%9D%A2%E5%9B%BE%20%284%29.png","authors":["陈杰文"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-08-12T00:00:00.000Z","title":"基于 Node.js 的轻量级云函数功能实现","description":"在万物皆可云的时代，你的应用甚至不需要服务器。云函数功能在各大云服务中均有提供，那么，如何用「无所不能」的 Node.js 实现呢？","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Node.js","Serverless"],"keywords":"Serverless","outdated":null},"wordCount":{"words":227,"sentences":56,"paragraphs":56},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-12-nodejs.md","fields":{"slug":"/blog/2019-08-12-nodejs/","keywords":["java","koa","nodejs","serverless","无服务器","无服务器架构","云函数","函数","javascript","sandbox","func","执行"]}},"recommendBlogs":{"edges":[{"node":{"id":"4300b21c-7209-5256-86ff-0d38e3daec9b","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/14f1c8eed372e76c1b139703b2f6d0fa.jpg","authors":["KieranMcCarthy"],"categories":["user-stories","engineering-culture"],"date":"2018-01-09T00:00:00.000Z","title":"我是如何在四年时间里，从厨师转行为 Serverless 应用开发者","description":"我是厨师出身，现在成为了一名 Serverless 应用开发者。","authorslink":["https://serverless.com/author/kieranmccarthy/"],"translators":["Aceyclee"],"translatorslink":["https://www.zhihu.com/people/Aceyclee"],"tags":["应用开发","Serverless"],"keywords":"Serverless 应用开发,Serverless 管理,厨师转行为 Serverless 应用开发者","outdated":null},"wordCount":{"words":285,"sentences":38,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years.md","fields":{"slug":"/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years/","keywords":["无服务器","无服务器开发","云函数","学习","Serverless","构建","Framework","开发者","服务器","应用","学位","简历"]}}},{"node":{"id":"713a0563-4bf9-5721-bacb-3b4ef609fe4a","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/camp-fire/camp-fire-housing-thumb.jpg","authors":["EricWyne"],"categories":["guides-and-tutorials","user-stories"],"date":"2018-12-05T00:00:00.000Z","title":"Serverless Twitter 机器人帮助为坎普山火受灾者安置住房","description":"加利福尼亚州的坎普山火致使数千人流离失所，为此，我构建了一个简单的 Serverless Twitter 机器人来帮助将受灾者安置在临时住房！","authorslink":["https://serverless.com/author/ericwyne/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":157,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-05-serverless-twitter-camp-fire.md","fields":{"slug":"/blog/2018-12-05-serverless-twitter-camp-fire/","keywords":["serverless","无服务器","云函数","Serverless","org","住房","Twitter","函数","受灾","机器人","山火"]}}},{"node":{"id":"98602143-b837-5f50-a24f-3b1ec76044d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/sqquid/sqquid-serverless-thumb.jpg","authors":["RonPeled"],"categories":["user-stories"],"date":"2018-12-17T00:00:00.000Z","title":"SQQUID：100% 无服务器初创公司","description":"SQQUID 将 AWS Lambda 和无服务器框架用于其核心产品和营销网站。我们来看看一个完全无服务器的初创公司是怎样的。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":266,"sentences":42,"paragraphs":42},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-17-sqquid-one-hundred-percent-serverless.md","fields":{"slug":"/blog/2018-12-17-sqquid-one-hundred-percent-serverless/","keywords":["go","serverless","无服务器","无服务器架构","服务器","架构","Lambda","集成","FaaS","串行","系统"]}}},{"node":{"id":"29dc2e58-d2ba-56f9-aee1-d21b0bc62e0e","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/ao-com-story/ao-serverless-thumbnail.png","authors":["NickGottlieb"],"categories":["user-stories"],"date":"2019-04-24T00:00:00.000Z","title":"AO.com：逐渐转向无服务器优先","description":"AO.com 的 SCV 团队率先尝试无服务器服务。折服于无服务器框架的快速周转时间和低维护成本，整个团队逐渐转向无服务器优先。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":236,"sentences":42,"paragraphs":35},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-04-24-ao-serverless-first.md","fields":{"slug":"/blog/2019-04-24-ao-serverless-first/","keywords":["serverless","无服务器","服务器","团队","Lambda","功能","构建"]}}},{"node":{"id":"752d08d1-387a-5bde-acf3-98141baab294","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586871710979-%E5%85%AC%E5%85%B1%E7%94%A8.png","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-06-20T00:00:00.000Z","title":"如何用 Serverless 为 Python 云函数打包依赖","description":"在使用无服务器云函数SCF时通常会遇到导入第三方库的问题，很多小伙伴比较头疼是：应该如何打包进去？这里，推荐几个不错的方法。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["云函数","Serverless"],"keywords":"Serverless,Serverless应用,无服务器云函数","outdated":null},"wordCount":{"words":81,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-06-20-for-python-cloud-functions.md","fields":{"slug":"/blog/2019-06-20-for-python-cloud-functions/","keywords":["java","serverless","无服务器","无服务器云函数","云函数","serverlesscloud","安装","serverless","pillowtest"]}}},{"node":{"id":"2dc78814-9d77-555b-a1bb-ad202c8ec2d1","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/cloudforecast/thumbnail.png","authors":["FrancoisLagier"],"categories":["user-stories"],"date":"2019-08-07T00:00:00.000Z","title":"Serverless：初创企业的理想选择？（CloudForecast 案例分析）","description":"CloudForecast 是 2018 年成立的一家独立初创企业，本文将介绍他们决定选择 Serverless 的原因。","authorslink":["https://serverless.com/author/francoislagier/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":211,"sentences":29,"paragraphs":29},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-07-serverless-for-startups.md","fields":{"slug":"/blog/2019-08-07-serverless-for-startups/","keywords":["serverless","云函数","serverless","函数","Serverless","utm","Framework","blog","CloudForecast","cloudforecast"]}}},{"node":{"id":"97450b07-658b-5207-8216-1c7b9b51b115","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578988490344-v2-8b2cd2c5275aa2c5a3c5083a148a7a9f_1200x500.jpg","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-09-01T00:00:00.000Z","title":"如何通过 Serverless 与自然语言处理，让搜索引擎「看」到你的博客","description":"Serverless 与自然语言处理结合的一个小应用","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["个人博客","serverless"],"keywords":"Serverless 自然语言处理","outdated":null},"wordCount":{"words":106,"sentences":34,"paragraphs":34},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-01-search-engine-blog.md","fields":{"slug":"/blog/2019-09-01-search-engine-blog/","keywords":["serverless","云函数","keywords","serverlesscloud","summary"]}}},{"node":{"id":"ae4fd2f8-515c-5aec-b584-38427ef33f7e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578989800047-part-00492-780.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-09-16T00:00:00.000Z","title":"突破传统 OJ 瓶颈，「判题姬」接入云函数","description":"通过 Serverless 实现在线编程","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["在线编程","云函数"],"keywords":"Serverless 在线编程,Serverless OJ","outdated":null},"wordCount":{"words":169,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-16-online-Judge.md","fields":{"slug":"/blog/2019-09-16-online-Judge/","keywords":["python","serverless","云函数","代码","函数","serverless"]}}}],"totalCount":64}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"ba972f16-ced0-5ef4-8d03-5dadcc85044c","previousBlogId":"5a1206f0-492f-5446-a4fb-396fc2334b8f","nextBlogId":"22c72191-2b2a-5d57-8a0c-aa1616ee296c","categories":["user-stories"]}}}