簡介
本文檔介紹如何將後設資料與API結合使用,以便在python指令碼中自定義報告。
必要條件
需求
思科建議您瞭解以下主題:
採用元件
本文件所述內容不限於特定軟體和硬體版本。
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路正在作用,請確保您已瞭解任何指令可能造成的影響。
背景資訊
CloudCenter提供一些開箱即用的報告,但不允許使用基於自定義篩選器的報告方式。為了使用API直接從資料庫中獲取資訊,以及連線到作業的後設資料,您可以允許自定義報告。
設定後設資料
必須在每個應用程式級別上新增後設資料,因此必須修改需要使用自定義報告進行跟蹤的每個應用程式。
為此,請導航到應用程式配置檔案,然後選擇要編輯的應用程式的下拉選單,然後選擇編輯/更新(如圖所示)。
如果使用者要填寫此後設資料,請滾動到基本資訊的底部並新增後設資料標籤(例如BillingID),使其成為必需和可編輯的後設資料。如果它只是一個宏,則填寫預設值並且不能使其可編輯。填寫後設資料後,選擇Add,然後選擇Save App,如下圖所示。
收集API金鑰
為了處理API呼叫,需要使用者名稱和API金鑰。這些金鑰提供與使用者相同的訪問級別,因此,如果要在報告中新增所有使用者部署,則建議獲取租戶API金鑰的管理許可權。如果要一起記錄多個子租戶,則根租戶需要訪問所有部署環境,或者需要所有子租戶管理員的API金鑰。
要獲取API金鑰,請導航到Admin > Users > Manage API Key,複製所需使用者的使用者名稱和金鑰。
建立自定義報告
建立用於建立報告的python指令碼之前,請確保已在其上安裝python和pip。然後運行pip install tabulate,tabulate是一個自動處理格式化報表的庫。
此指南附加了兩個示例報告,第一個報告只是收集所有部署的資訊,然後將其輸出到表中。第二種使用相同資訊建立使用BillingID後設資料的自定義報告。將對此指令碼進行詳細解釋以用作指南。
import datetime
import json
import sys
import requests
##pip install tabulate
from tabulate import tabulate
from operator import itemgetter
from decimal import Decimal
datetime用於準確計算日期,建立最近X天的報告。
json用於幫助分析json資料,即api呼叫的輸出。
sys用於系統呼叫。
請求用於簡化對API呼叫的網路請求。
表格用於自動設定表格格式。
itemgetter用作對2D表進行排序的迭代器。
十進制用於將成本舍入為兩個小數位。
if(len(sys.argv)==1):
days = -1
elif(len(sys.argv)==2):
try:
days = int(sys.argv[1])
if(days < 1):
raise ValueError('Less than 1')
start=datetime.datetime.now()+datetime.timedelta(days*-1)
except ValueError:
print("Number of days must be an integer greater than 0")
exit()
else:
print("Enter number of days to report on, or leave blank to report all time")
exit()
此部分用於分析天數的命令列引數。
如果沒有命令列引數(sys.argv ==1),則報告將始終完成。
如果有一個命令列引數,請檢查該引數是否為大於或等於1的整數,如果在該天數上報告該引數,如果不是,則返回錯誤。
如果有多個引數,則返回錯誤。
departments = []
users = ['user1','user2','user3']
passwords = ['user1Key','user2Key','user3Key']
departments是儲存最終輸出的清單。
用戶是將要進行API呼叫的所有使用者的清單,如果存在多個子租戶,則每個使用者將成為不同子租戶的管理員。
passwords是使用者API金鑰的清單,使用者和金鑰的順序需要相同,才能使用正確的金鑰。
for j in xrange(0,len(users)):
jobs = []
r = requests.get('https://ccm2.cisco.com/v1/jobs', auth=(users[j], passwords[j]), headers={'Accept': 'application/json'})
data = r.json()
for i in xrange(0,len(data["jobs"])):
test = datetime.datetime.strptime((data["jobs"][i]["startTime"]), '%Y-%m-%d %H:%M:%S.%f')
if(days != -1):
if(start < test):
jobs.append([data["jobs"][i]["id"],'None', data["jobs"][i]["cost"]["totalCost"],data["jobs"][i]["status"],data["jobs"][i]["displayName"],data["jobs"][i]["startTime"]])
else:
jobs.append([data["jobs"][i]["id"],'None', data["jobs"][i]["cost"]["totalCost"],data["jobs"][i]["status"],data["jobs"][i]["displayName"],data["jobs"][i]["startTime"]])
for id in jobs:
q = requests.get('https://ccm2.cisco.com/v1/jobs/'+id[0], auth=(users[j], passwords[j]), headers={'Accept': 'application/json'})
data2 = q.json()
id[2]=round(id[2],2)
for i in xrange(0,len(data2["metadatas"])):
if('BillingID' == data2["metadatas"][i]["name"]):
id[1]=data2["metadatas"][i]["value"]
added=0
for i in xrange(0,len(departments)):
if(departments[i][0]==id[1]):
departments[i][1]+= 1
departments[i][2]+=id[2]
added=1
if(added==0):
departments.append([id[1],1,id[2]])
對於xrange(0,len(users))中的j:is for loop to iterate through evidual code chunk中定義的每個使用者,這是處理所有API呼叫的主循環。
作業是一個臨時清單,在將作業資訊整理到清單中時,該清單將用於儲存該作業的資訊。
r = requests.get.....是第一個API呼叫,此呼叫列出所有作業,有關詳細資訊,請參閱列出作業。
然後,將結果以json格式儲存在資料中。
對於xrange(0,len(data["jobs"])中的i:重複執行從上一個API呼叫返回的所有作業。
從json提取每個作業的時間並將其轉換為datetime對象,然後將其與輸入的命令列引數進行比較,以檢視其是否在界限內。
如果是,則附加至作業清單的是json中的以下資訊:id、totalCost、status、name、start time。不會使用所有這些資訊,也不會使用可以返回的所有資訊。清單作業顯示可以相同方式新增的所有返回資訊。
在迭代該使用者返回的所有作業後,將移至作業中的for id:它循環檢查開始日期後執行的所有作業。
q = requests.get(...)..是第二個API呼叫,該呼叫列出與從第一個API呼叫中獲取的作業ID相關的所有資訊。 有關詳細資訊,請參閱獲取作業詳細資訊。
json檔案隨後儲存在data2中。
儲存在id[2]中的成本將四捨五入為兩個小數位。
對於xrange(0,len(data2["metadatas"])中的i:循環與作業關聯的所有後設資料。
如果有名為BillingID的後設資料,則此後設資料將儲存在作業資訊中。
added是用於確定BillingID是否已新增到部門列表的標誌。
對於xrange(0,len(departments))中的i:循環訪問新增的所有部門。
如果此作業是已存在部門的一部分,則作業計數將逐個迭代,並且成本將新增到該部門的總成本中。
如果不是,則將新行附加到任務計數為1且總成本等於此任務的成本的部門。
departments = sorted(departments, key=itemgetter(1))
print(tabulate(departments,headers=['Department','Number of Jobs','Total Cost']))
departments = sorted(departments, key=itemgetter(1))按作業數對部門排序。
print(tablet(departments,headers=['Department','Jobs Number', 'Total Cost']))列印由包含三個標題的表格創建的表格。
相關資訊