import requests
#引入需要的库文件,requests处理API连接请求
import json
#引入json库做数据处理
from kafka import KafkaProducer
#引入kafka库,调用生产者向kafka发送数据
from kafka.errors import KafkaError
#引入kafka异常库
# Kafka配置
kafka_server = '192.168.111.111:8008' # 替换为您的Kafka服务器地址和端口
kafka_topic = 'CMDB-DATA-TEST' # 替换为您的Kafka主题名称
# 设定每页的大小
page_size = 1000
url = "http://192.168.129.111:8081/AIPAA/CMDB/303011"
headers = {
"Content-Type": "application/json",
}
#根据实际情况配置API接口
# 首先请求一次以获取总数据量
initial_data = {"pageNo": "1", "pageSize": str(page_size), "templateCode": "BpAppSystem_Other_ALL", "token": "acess-token=eyJh..."}
#API接口参数,根据实际情况修改参数
initial_response = requests.post(url, headers=headers, json=initial_data)
#初始化请求返回的数据,将返回值先给到initial_response保存起来
total = initial_response.json()['esbData']['content']['content']['total']
#根据实际情况提取数据字段,这里根据返回数据提取total的值
# 计算总页数
total_pages = -(-total // page_size)
#这里要考虑做向上取整
# 函数用于异步发送数据到Kafka
#def send_to_kafka(data):
# message = json.dumps(data, ensure_ascii=False)
# command = f"echo '{message}' | /data/app/kafka/bin/kafka-console-producer.sh --bootstrap-server {kafka_server} --topic {kafka_topic} &"
# subprocess.run(command,shell=True,check=True)#逐条发送
# subprocess.Popen(command, shell=True)#异步发送
#使用subprocess库推送数据到kafka会受到kafka所在主机性能影响,经实际验证,并不是最优的解决方案,因此无需考虑该部分实现方式。
def send_to_kafka(bootstrap_servers, kafka_topic, messages):
#定义实现方法,KafkaProducer要求传入kafka连接信息、topic信息以及数据这三个参数,参数名称可以自定义,与代码前面的定义保持一致即可。
"""
发送数据到 Kafka 主题
Parameters:
bootstrap_servers (str): Kafka 服务器地址
topic (str): Kafka 主题
messages (list): 包含要发送的数据消息的列表
"""
# 创建 Kafka 生产者
producer = KafkaProducer(bootstrap_servers=kafka_server)
for message in messages:
try:
# 发送数据到 Kafka 主题,并等待发送结果
# message=str(message)
future = producer.send(topic, value=message.encode('utf-8'))
future.get(timeout=10) # 等待发送完成或超时
#print(message)
# print(f"Message sent to Kafka topic: {topic}")
except KafkaError as e:
# 处理发送过程中的 Kafka 错误
print(f"Error sending message to Kafka: {e}")
# 关闭 Kafka 生产者连接
producer.close()
# 循环请求每一页
for page_no in range(1, total_pages + 1):
data = {"pageNo": str(page_no), "pageSize": str(page_size), "templateCode": "GetBpAppSystem_Other_ALL", "token": "acess-token=eyJh..."}
response = requests.post(url, headers=headers, json=data)
data_content = response.json()['esbData']['content']['content']
#这里需要对数据中的数据做提取处理,我需要拿到['esbData']['content']['content']中的数据,实际情况根据API的返回不同,这里需要自定义更改
# 对content下的data键中的每个条目进行修改
for item in data_content.get('data', []):
new_data = []#每次循环清空上一次的数据
copied_data = []#每次循环清空上一次的数据
#初始化两个空数组
# 复制原始条目
copied_item = item.copy()
#根据实际需要,我需要将原始数据复制一份,修改格式后输出
# 对原始条目进行修改
if 'hostName' in item:
item['ciName'] = item['secondApp']
new_data = {
"content": item,
"completed": 0,
"modelId": "Bussiness",
"accountId": 110,
"userId": 3,
"tenantId": 110,
"sourceName": "AAA",
"actionType": "UPSET",
"exceptions": []
}#配置数据的输出格式,需要根据实际应用场景去调整和修改
# 对复制的条目进行进一步的修改
copied_item['modelId'] = item.get('relentry', '')
if item.get('relentry') == "K8s命名空间":
copied_item['modelId'] = "K8s_Namespace"
copied_item['ciName'] = item.get('hostName', '')
copied_item['reluseFor'] = item.get('reluseFor', '')
copied_item['relinstId'] = item.get('relinstId', '')
copied_item['relciStatus'] = item.get('relciStatus', '')
copied_item['relationSystem'] = [{
"modelId":"Business",
"uniFields":{
"instId":copied_item.get('instId','')
}
}]#引用时需要指定modelId和被引用模型的唯一约束
copied_data = {
"content": copied_item,
"completed": 0,
"modelId": copied_item['modelId'],
"accountId": 110,
"userId": 3,
"tenantId": 110,
"sourceName": "DOCC",
"actionType": "UPSET",
"exceptions": []
}
# 异步发送数据到Kafka
#send_to_kafka(new_data)
#send_to_kafka(copied_data)
#以上输出方式为subprocess库的实现方式,无需考虑
send_to_kafka(kafka_server,kafka_topic,new_data)
send_to_kafka(kafka_server,kafka_topic,copied_data)
#print(json.dumps(new_data,ensure_ascii=False))
#print(json.dumps(copied_data,ensure_ascii=False))
#调用代码send_to_kafka方法做输出,将处理好格式的数据发送给kafka即可。
# 代码结束
Python调用API接口清洗数据推送Kafka案例脚本
最新推荐文章于 2024-06-17 19:58:35 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)