Новая консоль управления данными Db2 — это бесплатный пользовательский интерфейс на основе браузера, включенный в Db2 для Linux, UNIX и Windows. Это больше, чем графический интерфейс пользователя для мониторинга, управления, запуска и оптимизации Db2. Это набор открытых RESTful API и микросервисов для Db2.
Все, что вы можете сделать в пользовательском интерфейсе, также доступно через REST. Вы также можете встраивать части пользовательского интерфейса в свои собственные веб-страницы или в блокноты Jupyter.
В этой статье показано, как использовать открытые API RESTful и составные пользовательские интерфейсы, доступные в службе консоли Db2.
Чтобы узнать больше о консоли Db2, посетите сообщество по адресу www.ibm.biz/Db2Console . Вы можете скачать консоль Db2 и найти другие примеры кодирования, лучшие практики и доступ к бесплатной практической лаборатории кодирования.
Вы также можете прочитать:
Вызов API REST из микросервисов Java
Построение API-вызовов
Чтобы получить доступ к сервису, нам нужно сначала пройти аутентификацию с сервисом и создать токен многократного использования, который мы можем использовать для каждого вызова сервиса. Токен гарантирует, что нам не нужно предоставлять ID пользователя и пароль каждый раз, когда мы запускаем команду, сохраняя связь в безопасности.
Каждый запрос состоит из нескольких частей. Во-первых, вам необходимо определить URL-адрес службы. Например: http://localhost:11080
. В этом примере мы предполагаем, что консольная служба работает на той же машине, что и ноутбук Jupyter, но она может быть удаленной. Порт 11080 типичен для запуска незащищенного соединения. (11081 для https).
Затем вам нужно определить API и версию API. В этом случае dbapi/v4
.
Следующая часть вызова определяет запрос REST и параметры. Например '/metrics/applications/connections/current/list'
. Далее следуют дополнительные параметры, разделенные знаком &
.
Таким образом, полный вызов может выглядеть так:
HTTP
xxxxxxxxxx
1
http://9.30.210.195:11080/dbapi/v4/metrics/applications/connections?end=1579643744759&include_sys=false&limit=100&offset=0&sort=-application_handle&start=1579640144759
В этом случае параметры включают время начала и окончания, включать ли сгенерированные системой соединения, как сортировать результаты и где начинать список.
Некоторые сложные запросы также включают полезную нагрузку JSON. Например, запуск SQL включает в себя объект JSON, который идентифицирует сценарий, разделители операторов, максимальное количество строк в наборе результатов, а также действия, которые выполняются в случае сбоя оператора.
Полный набор API задокументирован как часть пользовательского интерфейса Db2 Data Management Console в меню справки.
Вы также можете использовать инструменты разработчика в своем любимом браузере для просмотра трафика API между пользовательским интерфейсом консоли Db2 и службой API консоли Db2.
Простой пример cURL
cURL — это инструмент командной строки для получения или отправки данных, включая файлы, с использованием синтаксиса URL. Название расшифровывается как «Клиентский URL». Особенно полезно писать простые сценарии для доступа к API RESTful консоли Db2. В этом примере мы включаем вызовы cURL в скрипт BASH. Сценарий создает URL-адреса, содержащие вызовы RESTful, а затем отправляет их на коммуникационный порт 11080 консоли Db2.
Библиотека jq, которую я использовал в этих примерах, делает анализ JSON несложным.
Первый вызов устанавливает соединение и получает токен многократного использования, который используется для безопасной отправки дополнительных запросов.
Простой текст
xxxxxxxxxx
1
#!/bin/bash
2
## curl-basic-auth
3
## - http basic Db2 Console Authentication Example
4
## curl in bash
5
## use jq to parse JSON, see https://stedolan.github.io/jq/download/
6
## version 0.0.1
7
##################################################
8
HOST='http://localhost:11080'
10
USERID='db2inst1'
11
PASSWORD='db2inst1'
12
CONNECTION='SAMPLE'
13
## Authenticate with the service and return a reusable connection token
15
TOKEN=$(curl -s -X POST $HOST/dbapi/v4/auth/tokens \
16
-H 'content-type: application/json' \
17
-d '{"userid": '$USERID' ,"password":'$PASSWORD'}' | jq -r '.token')
Получив токен многократного использования, вы можете начать получать данные из службы. В этом первом примере мы получаем информацию о соединении с базой данных, которое мы используем:
Простой текст
xxxxxxxxxx
1
## Get the details of the database you are connected to
2
JSON=$(curl -s -X GET \
3
$HOST'/dbapi/v4/dbprofiles/'$CONNECTION \
4
-H 'authorization: Bearer '$TOKEN \
5
-H 'content-type: application/json')
6
echo $JSON | jq '.'
Консоль Db2 сохраняет информацию для подключения к базе данных Db2 в профиле подключения. Вот как это выглядит в JSON, который возвращается:
JSON
xxxxxxxxxx
1
{
2
"name": "SAMPLE",
3
"disableDataCollection": "false",
4
"databaseVersion": "11.5.0",
5
"databaseName": "SAMPLE",
6
"timeZone": "-50000",
7
"DB2Instance": "db2inst1",
8
"db2license": "AESE,DEC",
9
"isInstPureScale": "false",
10
"databaseVersion_VRMF": "11.5.0.0",
11
"sslConnection": "false",
12
"userProfileRole": "OWNER",
13
"timeZoneDiff": "0",
14
"host": "localhost",
15
"_PROFILE_INIT_": "true",
16
"dataServerType": "DB2LUW",
17
"port": "50000",
18
"URL": "jdbc:db2://localhost:50000/SAMPLE",
19
"edition": "AESE,DEC",
20
"isInstPartitionable": "false",
21
"dataServerExternalType": "DB2LUW",
22
"capabilities": "[\"DSM_ENTERPRISE_LUW\"]",
23
"OSType": "Linux",
24
"location": ""
25
}
Вы можете получить больше, чем просто информацию о настройке и настройке. Следующий пример возвращает список схем, доступных в базе данных:
Простой текст
xxxxxxxxxx
1
JSON=$(curl -s -X GET \
2
$HOST'/dbapi/v4/schemas' \
3
-H 'authorization: Bearer '$TOKEN \
4
-H 'content-type: application/json' \
5
-H 'x-db-profile: '$CONNECTION)
6
echo $JSON | jq '.'
Вот набор результатов:
JSON
xxxxxxxxxx
1
{
2
"count": 14,
3
"resources": [
4
{
5
"definertype": "U",
6
"name": "DB2INST1"
7
},
8
{
9
"definertype": "S",
10
"name": "IBM_RTMON"
11
},
12
{
13
"definertype": "S",
14
"name": "NULLID"
15
},
16
{
17
"definertype": "S",
18
"name": "SQLJ"
19
},
20
{
21
"definertype": "S",
22
"name": "SYSCAT"
23
},
24
{
25
"definertype": "S",
26
"name": "SYSFUN"
27
},
28
{
29
"definertype": "S",
30
"name": "SYSIBM"
31
},
32
{
33
"definertype": "S",
34
"name": "SYSIBMADM"
35
},
36
{
37
"definertype": "S",
38
"name": "SYSIBMINTERNAL"
39
},
40
{
41
"definertype": "S",
42
"name": "SYSIBMTS"
43
},
44
{
45
"definertype": "S",
46
"name": "SYSPROC"
47
},
48
{
49
"definertype": "S",
50
"name": "SYSPUBLIC"
51
},
52
{
53
"definertype": "S",
54
"name": "SYSSTAT"
55
},
56
{
57
"definertype": "S",
58
"name": "SYSTOOLS"
59
}
60
]
61
}
Ноутбуки Python и Jupyter и консоль Db2
Когда вы начнете заниматься более сложными проектами, вам понадобится более мощный язык и более мощная среда. Я обнаружил, что ноутбуки Python и Jupyter - отличный способ создать очень мощные подпрограммы для автоматизации вашей работы с Db2 через консоль Db2.
Для администраторов баз данных, которые сегодня используют скрипты, есть несколько преимуществ, помимо простого использования мощного языка, такого как Python. Ноутбуки Jupyter являются частью простой, но мощной среды разработки, которая позволяет создавать и совместно использовать свои ноутбуки. Ноутбуки могут объединять код, микросервисы, документацию и анализ данных в один документ.
Давайте начнем с нескольких подпрограмм Python, которые помогут вам начать. (Все примеры здесь доступны через GITHUB со ссылками в конце статьи.)
Импортируйте несколько вспомогательных классов
Для начала вам нужно включить несколько стандартных библиотек Python, чтобы мы могли работать с REST, JSON и взаимодействовать с API-интерфейсами консоли Db2.
питон
xxxxxxxxxx
1
# Import the class libraries
2
import requests
3
import ssl
4
import json
5
from pprint import pprint
6
from requests import Response
7
from requests.packages.urllib3.exceptions import InsecureRequestWarning
8
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
Класс Db2
Чтобы упростить жизнь, мы создали вспомогательный класс Db2, который инкапсулирует вызовы REST API, которые обращаются к службе консоли Db2. Приведенный ниже класс включает извлечение токена многократного использования, а также базовых структур для запросов POST и GET и извлечение JSON из ответов API.
питон
xxxxxxxxxx
1
# Run the Db2 Class library
2
# Used to construct and reuse an Autentication Key
3
# Used to construct RESTAPI URLs and JSON payloads
4
class Db2():
5
6
def __init__(self, url, verify = False, proxies=None, ):
7
self.url = url
8
self.proxies = proxies
9
self.verify = verify
10
def authenticate(self, userid, password, profile=""):
12
credentials = {'userid':userid, 'password':password}
13
r = requests.post(self.url+'/auth/tokens', verify=self.verify, \
14
json=credentials, proxies=self.proxies)
15
if (r.status_code == 200):
16
bearerToken = r.json()['token']
17
if profile == "":
18
self.headers = {'Authorization': 'Bearer'+ ' '+bearerToken}
19
else:
20
self.headers = {'Authorization': 'Bearer'+ ' '+bearerToken, \
21
'X-DB-Profile': profile}
22
else:
23
print ('Unable to authenticate, no bearer token obtained')
24
25
def getRequest(self, api, json=None):
26
return requests.get(self.url+api, verify = self.verify, headers=self.headers, proxies = self.proxies, json=json)
27
def postRequest(self, api, json=None):
29
return requests.post(self.url+api, verify = self.verify, headers=self.headers, proxies = self.proxies, json=json)
30
31
def getStatusCode(self, response):
32
return (response.status_code)
33
def getJSON(self, response):
35
return (response.json())
Установление соединения с консолью
Чтобы подключиться к службе консоли управления данными Db2, необходимо указать URL-адрес, имя службы (v4), имя пользователя и пароль консоли Db2, а также имя профиля подключения, используемого консолью Db2 для подключения к нужной базе данных. работать с.
питон
xxxxxxxxxx
1
# Connect to the Db2 Data Management Console service
2
Console = 'http://localhost:11080'
3
profile = 'SAMPLE'
4
user = 'DB2INST1'
5
password = 'db2inst1'
6
# Set up the required connection
8
profileURL = "?profile="+profile
9
databaseAPI = Db2(Console+'/dbapi/v4')
10
databaseAPI.authenticate(user, password, profile)
11
database = Console
Подтвердите соединение
Чтобы убедиться, что ваше соединение работает, получите информацию о конкретном соединении с базой данных, с которым вы работаете. Поскольку идентификатор пользователя и пароль вашей консоли могут быть ограничены в отношении того, к каким базам данных они могут получить доступ, вам необходимо предоставить имя профиля подключения, чтобы получить подробную информацию о базе данных.
Посмотрите на JSON, который возвращается вызовом в ячейке ниже. (Это похоже на то, что вы сделали с cURL.) Вы можете увидеть имя профиля соединения, имя базы данных, экземпляр базы данных, к которой принадлежит база данных, версию, выпуск и редакцию Db2, а также операционную систему, в которой он работает. работает на.
питон
xxxxxxxxxx
1
# List Monitoring Profile
2
r = databaseAPI.getRequest('/dbprofiles/'+profile)
3
json = databaseAPI.getJSON(r)
4
print(json)
Джава
xxxxxxxxxx
1
{'name': 'SAMPLE', 'disableDataCollection': 'false', 'databaseVersion': '11.5.0', 'databaseName': 'SAMPLE', 'timeZone': '-50000', 'DB2Instance': 'db2inst1', 'db2license': 'AESE,DEC', 'isInstPureScale': 'false', 'databaseVersion_VRMF': '11.5.0.0', 'sslConnection': 'false', 'userProfileRole': 'OWNER', 'timeZoneDiff': '0', 'host': 'localhost', '_PROFILE_INIT_': 'true', 'dataServerType': 'DB2LUW', 'port': '50000', 'URL': 'jdbc:db2://localhost:50000/SAMPLE', 'edition': 'AESE,DEC', 'isInstPartitionable': 'false', 'dataServerExternalType': 'DB2LUW', 'capabilities': '["DSM_ENTERPRISE_LUW"]', 'OSType': 'Linux', 'location': ''}
Вы также можете проверить состояние службы мониторинга. Этот вызов занимает немного больше времени, поскольку он выполняет быструю диагностическую проверку в службе мониторинга консоли управления данными Db2. Вы должны увидеть, что база данных и службы аутентификации подключены к сети.
питон
xxxxxxxxxx
1
# Get Monitor Status
2
r = databaseAPI.getRequest('/monitor')
3
json = databaseAPI.getJSON(r)
4
print(json)
Джава
xxxxxxxxxx
1
{'database_service': 'online', 'authentication_service': 'online', 'messages': ['Succeed']}
Исследование объекта
Консоль позволяет работать с объектами в базе данных. Вот только два примера того, как получить к нему доступ через REST и составной интерфейс.
Список доступных схем в базе данных
Вы можете вызвать микросервис Db2 Data Management Console, чтобы предоставить активный компонент консоли, который вы можете включить в IFrame непосредственно в свой блокнот. При первом обращении к нему вам нужно будет войти в систему, как и в любой другой раз, когда вы используете консоль в новом сеансе браузера. Если вы хотите просмотреть все схемы, включая схемы каталога, выберите переключатель «Показать системные схемы» в правой части панели.
В интерфейсе микросервиса обозревателя схем нажмите Показать системные схемы в правой части экрана. Здесь отображаются все схемы в каталоге Db2, а также пользовательские схемы.
питон
xxxxxxxxxx
1
from IPython.display import IFrame
2
IFrame(database+'/console/?mode=compact#explore/schema'+profileURL, width=1400, height=500)
Вы можете получить тот же список с помощью вызова службы RESTful, который мы рассмотрим в следующем примере.
Панды DataFrames
Многие из приведенных ниже примеров используют библиотеку Pandas DataFrames. С наборами данных JSON работать намного проще, если вы можете преобразовать их в DataFrame. Чтобы использовать их, вам необходимо импортировать необходимые библиотеки.
питон
xxxxxxxxxx
1
import pandas as pd
2
from pandas.io.json import json_normalize
DataFrames - это мощный способ представления данных в Python в виде таблицы в памяти. Библиотека имеет много функций, которые могут манипулировать данными во фрейме.
Распечатка схем через API
Следующий пример вызывает /schemas
API. Если вызов успешен, он вернет код состояния 200. Вызов API возвращает структуру JSON, которая содержит список схем. Код извлекает секцию 'resources' результата JSON и передает его в функцию json_normalize, а затем используется для создания DataFrame. Один вызов отображает имена первых 10 схем. display(df[['name']].head(10))
быстрый способ отобразить все имена столбцов в DataFrame.
питон
xxxxxxxxxx
1
r = databaseAPI.getRequest('/schemas')
2
if (databaseAPI.getStatusCode(r)==200):
4
json = databaseAPI.getJSON(r)
5
df = pd.DataFrame(json_normalize(json['resources']))
6
print(', '.join(list(df)))
7
display(df[['name']].head(10))
8
else:
9
print(databaseAPI.getStatusCode(r))
Джава
xxxxxxxxxx
1
definertype, name
Поиск объекта
Вы можете искать объекты в вашей базе данных через /admin
API. Для этого API требуется полезная нагрузка JSON для определения критериев поиска. В этом примере мы ищем Views с «таблицей» в названии. Он будет искать как пользователей, так и каталогов.
питон
xxxxxxxxxx
1
# Search for tables across all schemas that match simple search critera
2
# Display the first 100
3
# Switch between searching tables or views
4
obj_type = 'view'
5
# obj_type = 'table'
6
search_text = 'TABLE'
7
rows_return=10
8
show_systems='true'
9
is_ascend='true'
10
json = {"search_name":search_text, \
12
"rows_return":rows_return, \
13
"show_systems":show_systems, \
14
"obj_type":obj_type, \
15
"filters_match":"ALL","filters":[]}
16
r = databaseAPI.postRequest('/admin/'+str(obj_type)+'s',json);
18
if (databaseAPI.getStatusCode(r)==200):
20
json = databaseAPI.getJSON(r)
21
df = pd.DataFrame(json_normalize(json))
22
print('Columns:')
23
print(', '.join(list(df)))
24
display(df[[obj_type+'_name']].head(100))
25
else:
26
print("RC: "+str(databaseAPI.getStatusCode(r)))
Джава
xxxxxxxxxx
1
Columns:
2
view_name, view_schema, owner, owner_type, read_only, valid, view_check, sql, create_time, alter_time, stats_time, optimize_query
Таблицы в схеме
В этом примере /schemas
API используется для возврата всех таблиц в одной схеме.
питон
xxxxxxxxxx
1
# Find all the tables in the SYSIBM schema and display the first 10
2
schema = 'SYSIBM'
3
r = databaseAPI.getRequest('/schemas/'+str(schema)+'/tables');
4
if (databaseAPI.getStatusCode(r)==200):
6
json = databaseAPI.getJSON(r)
7
df = pd.DataFrame(json_normalize(json['resources']))
8
print(', '.join(list(df)))
9
display(df[['schema','name']].head(10))
10
else:
11
print(databaseAPI.getStatusCode(r))
Джава
xxxxxxxxxx
1
Columns:
2
schema, name
Доступ к ключевым показателям производительности
Вы можете получить доступ к ключевым высокоуровневым показателям производительности, непосредственно включив страницу сводки мониторинга в IFrame или вызвав /metrics
API. Чтобы просмотреть историю временных рядов числа строк, прочитанных в вашей системе за последний день, выполните приведенную ниже инструкцию. Затем перейдите к правой стороне и найдите виджет пропускной способности базы данных. Затем выберите «Чтение строк» и «Последний час».
питон
xxxxxxxxxx
1
IFrame(database+'/console/?mode=compact#monitor/summary'+profileURL, width=1400, height=500)
Чтобы получить доступ к тем же данным напрямую через API, вы можете использовать /metrics/rows_read
вызов API. Чтобы извлечь данные временных рядов из JSON, возвращенного из API, необходимо получить доступ к части «временных рядов» полного набора данных JSON.
Приведенный ниже пример извлекает данные за последний час и преобразует их в Pandas DataFrame для удобства манипулирования. Он печатает имена столбцов, доступных в кадре данных.
питон
xxxxxxxxxx
1
# Retrieve the number of rows read over the last hour
2
import time
3
endTime = int(time.time())*1000
4
startTime = endTime-(60*60*1000)
5
# Return the rows read rate over the last hour
7
r = databaseAPI.getRequest('/metrics/rows_read?start='+str(startTime)+'&end='+str(endTime));
8
if (databaseAPI.getStatusCode(r)==200):
10
json = databaseAPI.getJSON(r)
11
if json['count'] > 0:
12
df = pd.DataFrame(json_normalize(json['timeseries'])) #extract just the timeseries data
13
print('Available Columns')
14
print(', '.join(list(df)))
15
else:
16
print('No data returned')
17
else:
18
print(databaseAPI.getStatusCode(r))
Джава
xxxxxxxxxx
1
Columns:
2
Available Columns rows_read_per_min, interval, timestamp
EPOC Преобразование времени
Данные временных рядов возвращаются как время эпохи UNIX. Это число мс с 1 января 1970 года. Обратите внимание, что время начала и окончания в запросе REST также определяется во времени EPOC.
Чтобы сделать данные временных рядов читаемыми, нам нужна процедура для преобразования из EPOC в удобочитаемую временную метку.
питон
xxxxxxxxxx
1
# Setup data frame set calculation functions
2
def epochtotimeseries(epoch):
3
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(epoch/1000))
Далее мы применим процедуру к каждой строке в кадре данных и отобразим последние 20 измерений.
питон
xxxxxxxxxx
1
# Convert from EPOCH to timeseries data
2
# Display the last 20 datapoints
3
df['timestamp'] = df['timestamp'].apply(epochtotimeseries)
4
display(df[['timestamp','rows_read_per_min']].tail(20))
Наконец, мы можем построить результаты.
питон
xxxxxxxxxx
1
%matplotlib inline
2
import matplotlib
3
import matplotlib.pyplot as plt
4
df[['timestamp','rows_read_per_min']].tail(10) \
5
.plot.line(x='timestamp',y='rows_read_per_min', figsize=(20,4))
6
plt.show()
Использование хранилища
Вы можете получить доступ к странице отчета хранилища напрямую, вызвав ее в IFrame, или получить доступ к данным из API. В приведенном ниже отчете вы можете выбрать временные рамки для использования хранилища, сгруппировать по таблицам или по схеме, выбрать объект, который вы хотите проанализировать, а затем выбрать View Details в столбце Actions.
питон
xxxxxxxxxx
1
IFrame(database+'/console/?mode=compact#monitor/storage'+profileURL, width=1400, height=480)
Вы также можете перечислить хранилище по схеме. В следующем примере извлекается текущий уровень использования хранилища. В результатах JSON доступно много столбцов, но в приведенном ниже примере показано имя и размер схемы.
питон
xxxxxxxxxx
1
# List storage used by schema
2
# Display the top ten schemas
3
r = databaseAPI.getRequest('/metrics/storage/schemas?end=0&include_sys=true&limit=1000&offset=0&start=0')
4
if (databaseAPI.getStatusCode(r)==200):
6
json = databaseAPI.getJSON(r)
7
if json['count'] > 0:
8
df = pd.DataFrame(json_normalize(json['resources']))
9
print(', '.join(list(df)))
10
df['space_mb'] = df['data_physical_size_kb'].apply(lambda x: x / 1024)
11
df = df.sort_values(by='data_physical_size_kb', ascending=False)
12
display(df[['tabschema','space_mb']].head(10))
13
else:
14
print('No data returned')
15
else:
16
print("RC: "+str(databaseAPI.getStatusCode(r)))
Джава
1
timestamp, tabschema, type, lastused, rowcompmode, data_logical_size_kb, index_logical_size_kb, long_logical_size_kb, lob_logical_size_kb, xml_logical_size_kb, column_organized_data_logical_size_kb, total_logical_size_kb, data_physical_size_kb, index_physical_size_kb, long_physical_size_kb, lob_physical_size_kb, xml_physical_size_kb, column_organized_data_physical_size_kb, total_physical_size_kb, estimated_reclaim_size_kb, est_adapt_svgs_kb, est_adapt_svgs_pct, est_static_svgs_kb, est_static_svgs_pct, est_reclaim_svgs_pct
Это всего лишь несколько примеров того, что возможно при использовании открытых API RESTful и пользовательского интерфейса микросервиса в консоли Db2.
Вы можете найти копию этой записной книжки на GitHub . Эта библиотека GitHub включает в себя множество других записных книжек, которые охватывают более сложные примеры того, как использовать Db2 и Jupyter вместе через открытые API.
Вы также можете получить доступ к бесплатной практической интерактивной лаборатории, в которой используются все ноутбуки, по адресу www.ibm.biz/DMCDemosPOT . После того, как вы зарегистрируетесь в лаборатории, вы получите доступ к действующей облачной системе под управлением Db2, консоли Db2, а также обширным ноутбукам Jupyter и Python, которые помогут вам учиться на практике.
Дальнейшее чтение
Разработка RESTful API с микросервисами в Java
API-интерфейсы RESTful и микросервисы: как сделать скачок и почему он не может ждать