CDN - API 类型问题排查

简介: 浅谈 在调用阿里云 CDN openAPI,经常会出现各种各样的问题排查起来没有好的思路不好分析,今天说下基本的排查思路。 分析 不管调什么 CDN openAPI,无论是控制台还是 SDK 或者用户的脚本,出现问题都可以按照如下思路排查。

作者:张医博

浅谈

在调用阿里云 CDN openAPI,经常会出现各种各样的问题排查起来没有好的思路不好分析,今天说下基本的排查思路。

分析

不管调什么 CDN openAPI,无论是控制台还是 SDK 或者用户的脚本,出现问题都可以按照如下思路排查。

搜集信息

1) 调用 CDN openAPI 一定会返回一个阿里云的 requestID ,这个值是用来排查用户完整的请求参数和返回结果的凭证,如果客户端调用 API 返回结果不是预期或者请求失败,都会返回,务必保留。

2)如果没有 requestID 返回的情况下,需要用户提供

  • 调用 openAPI 的名称;
  • 返回的异常结果全部截图;
  • 调用的方式是 API 还是 SDK;
  • 什么语言版本的。

问题分析

获取 requestID 的情况。

1)先查 云台,requestID 的请求过程记录;
一站式查询-》 ECS 全链路日志 -〉 输入 requestID -》调整日志 查询。
关注下列的信息,查看详细的返回错误内容,以及错误信息、API 名称;

image.png

2)搜索 API.文档
搜索对应的 API ,然后查看 API 请求是否有特殊说明,举例说明
类似如下是 API 调用文档,我们先要明白 API 是做什么的?然后了解使用上的限制?以及调用传参的限制?

image.png

对比用户的参数使用是否都是正确的,如果确保都是正确再向下排查。

3)调用测试

当文档和 requestID 都查不出来后,我们只能调用 openAPI 亲自测试一遍,这里提供了下载的测试脚本,可以参考。测试是请使用客户端的 AccesskeyID 和 SecretKey 测试,这样贴近用户环境测试结果更有效。

  • 两个脚本放在一个目录下运行

aliyun.ini 脚本

[Credentials]
accesskeyid = <ak>
accesskeysecret = <sk>

can.py 生成鉴权 URL 脚本

#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys,os
import urllib, urllib2
import base64
import hmac
import hashlib
from hashlib import sha1
import time
import uuid
import json
from optparse import OptionParser
import ConfigParser
import traceback

access_key_id = '';
access_key_secret = '';
cdn_server_address = 'https://cdn.aliyuncs.com'
CONFIGFILE = os.getcwd() + '/aliyun.ini'
CONFIGSECTION = 'Credentials'
cmdlist = '''
接口说明请参照pdf文档
'''

def percent_encode(str):
    res = urllib.quote(str.decode(sys.stdin.encoding).encode('utf8'), '')
    res = res.replace('+', '%20')
    res = res.replace('*', '%2A')
    res = res.replace('%7E', '~')
    return res

def compute_signature(parameters, access_key_secret):
    sortedParameters = sorted(parameters.items(), key=lambda parameters: parameters[0])

    canonicalizedQueryString = ''
    for (k,v) in sortedParameters:
        canonicalizedQueryString += '&' + percent_encode(k) + '=' + percent_encode(v)

    stringToSign = 'GET&%2F&' + percent_encode(canonicalizedQueryString[1:])

    h = hmac.new(access_key_secret + "&", stringToSign, sha1)
    signature = base64.encodestring(h.digest()).strip()
    return signature

def compose_url(user_params):
    timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())

    parameters = { \
            'Format'        : 'JSON', \
            'Version'       : '2014-11-11', \
            'AccessKeyId'   : access_key_id, \
            'SignatureVersion'  : '1.0', \
            'SignatureMethod'   : 'HMAC-SHA1', \
            'SignatureNonce'    : str(uuid.uuid1()), \
            'TimeStamp'         : timestamp, \
    }

    for key in user_params.keys():
        parameters[key] = user_params[key]

    signature = compute_signature(parameters, access_key_secret)
    parameters['Signature'] = signature
    url = cdn_server_address + "/?" + urllib.urlencode(parameters)
    return url

def make_request(user_params, quiet=False):
    url = compose_url(user_params)
    print url
def configure_accesskeypair(args, options):
    if options.accesskeyid is None or options.accesskeysecret is None:
        print("config miss parameters, use --id=[accesskeyid] --secret=[accesskeysecret]")
        sys.exit(1)
    config = ConfigParser.RawConfigParser()
    config.add_section(CONFIGSECTION)
    config.set(CONFIGSECTION, 'accesskeyid', options.accesskeyid)
    config.set(CONFIGSECTION, 'accesskeysecret', options.accesskeysecret)
    cfgfile = open(CONFIGFILE, 'w+')
    config.write(cfgfile)
    cfgfile.close()

def setup_credentials():
    config = ConfigParser.ConfigParser()
    try:
        config.read(CONFIGFILE)
        global access_key_id
        global access_key_secret
        access_key_id = config.get(CONFIGSECTION, 'accesskeyid')
        access_key_secret = config.get(CONFIGSECTION, 'accesskeysecret')
    except Exception, e:
        print traceback.format_exc()
        print("can't get access key pair, use config --id=[accesskeyid] --secret=[accesskeysecret] to setup")
        sys.exit(1)



if __name__ == '__main__':
    parser = OptionParser("%s Action=action Param1=Value1 Param2=Value2\n" % sys.argv[0])
    parser.add_option("-i", "--id", dest="accesskeyid", help="specify access key id")
    parser.add_option("-s", "--secret", dest="accesskeysecret", help="specify access key secret")
    
    (options, args) = parser.parse_args()
    if len(args) < 1:
        parser.print_help()
        sys.exit(0)

    if args[0] == 'help':
        print cmdlist
        sys.exit(0)
    if args[0] != 'config':
        setup_credentials()
    else: #it's a configure id/secret command
        configure_accesskeypair(args, options)
        sys.exit(0)

    user_params = {}
    idx = 1
    if not sys.argv[1].lower().startswith('action='):
        user_params['action'] = sys.argv[1]
        idx = 2

    for arg in sys.argv[idx:]:
        try:
            key, value = arg.split('=')
            user_params[key.strip()] = value
        except ValueError, e:
            print(e.read().strip())
            raise SystemExit(e)
    make_request(user_params)

4) 测试分析
如果发现按照 API 文档,生成的 API 调用 URL 没有问题,说明用户使用的 API 代码可能存在问题,或者传的参数和我们不一样。可以用生成的正常 URL 和异常的 URL 进行比对。

案例:

案例

有用户问控制台的各项指标什么含义,峰值 QPS 是哪个,总的 QPS 是哪个? HTTPS 的带宽和 HTTP 带宽怎么区分,等等。
或者控制体台报错的问题,访问控制异常问题,所有此类问题都可以按照如下排查;

image.png

分析

1) 首先浏览器打开 F12。开发者模式。

2) 找到你要浏览的页面或者你点击的功能模块,触发调用。

3)然后分析你触发调用请求的 URL 是什么,大致都可看出来的,并不复杂。比如我是查域名的流量,那就是 DescribeDomainBpsData.json 接口,也就是 CDN 的 openAPI ,因为即便是控制台也是调用后端 API 操作的。

4)然后看浏览器对应的响应头信息,将这些头和 API 对应的文档 返回参数说明对比就知道什么含义了。

image.png

案例

某用户反馈调用直播导播台的 DescribeCasters 功能,并没有返回 CasterTemplate 字段。

分析

首先找到这个 API 的解释说明
https://help.aliyun.com/document_detail/60261.html?spm=5176.10695662.1996646101.searchclickresult.1f352a00rEBEV7

image.png

通过这个 API 告诉了用户两个条件:

1)导播台分辨率配置,付费类型为预付费时必输。那也就是非预付费的不一定会输出。

2)用户是否在直播的播流域名上配置了,转码如果没有配置转码的话,一样不会输出 CasterTemplate 字段;

相关文章
|
安全 前端开发 物联网
现代 API 的类型划分
【2月更文挑战第28天】
|
IDE 大数据 Java
大数据问题排查系列 - HDFS FileSystem API 的正确打开方式,你 GET 了吗?
大数据问题排查系列 - HDFS FileSystem API 的正确打开方式,你 GET 了吗?
|
2月前
|
域名解析 缓存 监控
阿里云渠道商:如何排查阿里云CDN访问问题?
排查阿里云CDN访问问题需分步诊断:先检查DNS解析与CDN基础配置,再根据访问慢、内容未更新或50x错误等现象定位原因,结合ping、tracert及阿里云实时日志、节点检测等工具深度分析。掌握此流程,快速解决异常。
|
3月前
|
算法 API 数据安全/隐私保护
电商 API 双平台实战:淘宝 item.get + 京东 item_detail 对接指南(附可复用代码 + 问题排查)
本文详细解析了淘宝和京东双平台API对接的核心流程,涵盖资质申请、凭证获取、签名生成、高频接口调用及常见问题解决方案,助力开发者高效实现商品数据同步与管理。
|
5月前
|
监控 测试技术 API
电商API常见错误排查指南:避免集成陷阱
API集成是电商开发的核心,但常因认证、数据、限流等问题引发错误,影响项目进度与用户体验。本文详解常见错误类型、排查步骤与预防策略,结合Python示例指导开发者高效应对。通过日志分析、数据校验、速率监控等手段,帮助您系统化规避集成陷阱,提升开发效率与系统稳定性。
233 0
|
8月前
|
JSON 测试技术 API
API调用类型全面指南:理解基础知识
在数字化时代,API(应用程序编程接口)是连接不同软件应用的核心技术。掌握API调用类型对于开发高效、可扩展的系统至关重要。本文详细解析了GET、POST、PUT、DELETE等常见API请求方法,以及GraphQL、WebSocket等高级技术的应用场景。同时,介绍了APIPost这一强大工具如何优化API开发与测试流程。通过理解HTTP状态码、数据格式及请求头部信息,开发者能更好地设计和管理API,实现无缝跨平台通信。无论是数据获取、更新还是实时交互,合理选择API调用类型均可提升开发效率与用户体验。
|
监控 搜索推荐 数据挖掘
淘宝 API 接口的调用频率限制是否会因应用类型而异?
淘宝API调用频率限制依应用类型而异。电商管理类如商家后台、商品批量上传工具,调用频次较高;数据分析类如市场调研、店铺分析工具,频次较严;导购推荐类如第三方导购平台、社交媒体导购应用,依据规模与信誉设定;其他如开发者测试、个人小型应用则限制较宽松。
|
9月前
|
XML 网络协议 API
从cURL到GraphQL:不同API类型概述
本文概述了不同API类型及其应用,帮助开发人员选择合适的工具。cURL是强大的命令行工具,适用于调试和自动化;RESTful API基于HTTP方法,适合Web服务和微服务架构;SOAP用于企业级应用,提供高安全性;GraphQL通过精确查询减少数据传输;WebSocket支持实时通信,适用于低延迟场景。了解这些API的特点和优势,有助于构建高效、可扩展的应用程序。
|
前端开发 JavaScript API
TS 中的类型验算,高级通用 API 实现
这篇文章介绍了一些常用的类型通用API封装,包括TS内置类型和关键字的使用,以及TS compiler内部实现的类型。文章截取了一些常用的类型定义和API示例,如Partial、Required、Readonly、NonNullable、Parameters等。还介绍了一些常用的TS关键字,如extends、infer、keyof、typeof、in等。此外,文章还提供了一些实现示例,如Optional API、GetOptional API和UnionToIntersection API。该文章会不断更新。
220 0
TS 中的类型验算,高级通用 API 实现