IBM®Application Performance Management(APM)是用于监视关键应用程序和生产中用户体验的新一代监视解决方案。 到目前为止,IBMPureApplication®System仅支持IBMTivoli®Monitoring解决方案来监视工作负载。 借助APM的可用性,您可以选择另一个监视工作负载的方法。 不幸的是,您无法在PureApplication中找到APM模式,也无法使用PureApplication为其他工作负载模式启用APM监视。 借助PureApplication System的开放式体系结构,您可以使用脚本包自行进行集成。 该方法以其简单,灵活,开发和维护工作量低而闻名。
本教程说明了如何通过使用脚本包在PureApplication模式中启用APM监视。 它还演示了如何实现脚本包并将其应用于虚拟系统模式。
与IBM Tivoli Monitoring中的服务器和代理组类似,APM监视解决方案也由服务器和代理组组成:
从拓扑的角度来看,大多数APM代理预计将安装在运行要监视的目标软件产品的节点上。 APM服务器可以在代理可以访问的任何位置运行。
在PureApplication System中,您必须将APM代理插入虚拟系统模式中,以对模式中运行的中间件或数据库应用程序启用APM监视。 PureApplication的脚本包是可在虚拟系统模式中用于自定义模式行为的基本组件之一。 在本教程中,我们使用脚本包扩展虚拟系统模式,以包括为模式中的软件安装和配置APM代理。 您不需要作为PureApplication System的一部分运行APM服务器。 对于本教程,APM服务器已经在PureApplication之外安装并运行。 要安装和配置APM服务器,请参阅安装服务器 。
APM代理按目标软件分类。 该软件通常具有用于安装和配置代理的自己的参数。 大多数代理具有类似的安装和配置步骤。 因为不可能涵盖本教程中的所有代理,所以本教程仅以WebSphere Application Server的APM代理为例。 此示例演示如何编写脚本包并使用它来以WebSphere Application Server模式安装和配置WebSphere Application Server的APM代理。
本教程中描述的代码仅适用于Linux平台。 因此,在将代码应用于其他平台之前,请进行任何相应的更改。 要更改本教程中描述的代码并根据APM代理类型使用相应的命令,请参阅安装代理 。
脚本包通常包含一个元数据文件(名为cbscript.json
),一个主要的可执行文件以及相关的支持工件。 在我们的示例中,我们使用脚本为WebSphere Application Server模式中的WAS服务器安装和配置WebSphere Application Server的APM代理。
cbscript.json
文件是脚本包的规范。 它指向主脚本的位置,这是执行的起点。 该文件还包含脚本使用的所有配置参数。 以下清单显示了脚本包中使用的cbscript.json
文件的主要内容。
[
{
"command" : "python /tmp/apm_was/install_apmwas.py",
"commandargs": "${AGENT_URI} ${AGENT_HOME} ${WAS_HOME} ${WAS_PROFILE_NAME} ${WAS_CELL_NAME}
${WAS_NODE_NAME} ${WAS_SERVERS_PARM}",
"execmode": 2,
"filename": "APMWASAgent.zip",
"location": "/tmp/apm_was",
"name": "APM WAS agent",
"ostype": "linux/unix",
"timeout": 3600000,
"type": "APPLICATION",
"version": "1.0.0"
"keys": [
{
"required": true,
"scriptkey": "AGENT_URI",
"scriptdefaultvalue": "e.g. http://127.0.0.1/ipm_monitoring_agent_xlinux_8.1.3_configured.tar",
"label": "Configured Agent Image Location"
},
… …
],
}
]
在这些属性中,“ command”属性指示输入脚本是一个名为"install_apmwas.py"
的Python脚本。 该脚本运行以安装和配置WebSphere Application Server的APM代理。 我们将在以下各节中描述此脚本的实现。 "execmode"
属性的值2
表示该脚本仅在用户手动触发脚本后才执行。
该脚本需要一组参数,运行时在"commandargs"
进行描述。 下表中显示的自变量在导入或执行脚本包时会在用户界面(UI)上显示,并允许用户输入值。
“脚本键” | “标签” | “描述” |
---|---|---|
AGENT_URI | 配置的代理映像位置 | 指定已配置的APM代理映像的下载URL |
AGENT_HOME | APM代理安装目录 | 指定将在哪里安装APM代理 |
WAS_HOME | WAS安装目录 | 提供此虚拟机(VM)上WebSphere Application Server的安装位置 |
WAS_PROFILE_NAME | WAS配置文件名称 | 提供WebSphere Application Server的概要文件名称 |
WAS_CELL_NAME | WAS单元名称 | 提供WebSphere Application Server的单元名称 |
AS_NODE_NAME | WAS节点名称 | 提供此VM上的WebSphere Application Server的节点名 |
WAS_SERVERS_PARM | WAS服务器 | 对于WebSphere Application Server,提供服务器名称,启动WebSphere Application Server进程的系统用户以及自动重新启动WAS服务器的选项。 |
APM代理是从您在APM服务器端配置的映像安装的。 配置的映像包含APM服务器的地址,通信协议以及在APM代理和APM服务器之间使用的令牌。 当安装程序在代理和服务器之间建立连接时,它会参考该映像。 脚本包的用户必须提供配置的图像,并使该图像在HTTP服务器上可供下载。 "AGENT_URI"
键获取配置的图像位置。
配置WebSphere Application Server代理程序需要有关目标WAS服务器的信息,例如它们的概要文件名称,单元名称,节点名称和服务器名称。 该脚本通过使用其他信息来完成配置,例如是否与适当的系统用户一起自动重新启动WAS服务器。 "WAS_SERVERS_PARM"
键包含WAS服务器的所有信息。 为了使它们在一个字符串中可识别,该值必须使用以下架构:
如果涉及多个服务器,则多个值用逗号分隔,如以下示例所示:
server1:user1:true,server2:user2:true
"install_apmwas.py"
脚本是用Python编写的。 下图说明了脚本中的逻辑。
安装APM代理的WebSphere Application Server环境必须足够干净,以确保已安装的代理按预期工作。 出于以下原因,代理安装可能会失败,或者WebSphere Application Server的APM代理可能无法收集WebSphere Application Server的度量标准:
因此, "install_apmwas.py"
脚本首先检查并清除旧的监视代理程序和数据收集器配置。 WebSphere Application Server的ITCAM代理和WebSphere Application Server的APM代理都在其系统进程名称中专门包含"kynagent"
。 因此,脚本使用以下命令通过匹配进程名称来检测旧的监视代理。
cmd = 'ps –ef | grep kynagent | grep –v grep'
(rc,out,err) = maestro.log_call([cmd], shell=True)
if out > 0 :
print 'The agent is still running'
exit(1)
在检测到旧的监视代理程序之后,脚本还将处理卸载旧的代理程序。 但是,脚本通常会尝试在卸载脚本之前取消配置数据收集器,因为数据收集器通常是在安装了旧代理的情况下配置的。 在静默模式下取消配置数据收集器需要具有以下属性的配置文件。
[DEFAULT SECTION]
tema.host = 127.0.0.1
tema.appserver = True
temaconnect = True
tema.port = 63335
tema.jmxport = 63355
soa.enable = False
de.enable = False
ms.connect = False
ttapi.enable = False
tpv.enable = False
was.appserver.home = e.g. /opt/IBM/WebSphere/AppServer/ # Obtained from WAS_HOME in script package
was.appserver.profile.name = e.g. DefaultAppSrv01 # Obtained from WAS_PROFILE_NAME in script package
was.appserver.cell.name = e.g. CloudBurstCell # Obtained from WAS_CELL_NAME in script package
was.appserver.node.name = e.g. CloudBurstNode # Obtained from WAS_NODE_NAME in script package
was.client.props = True
was.backup.configuration = False
[SERVER]
was.appserver.server.name = e.g. server1 # Parsed from WAS_SERVERS_PARM
tema.serveralias = e.g. server1
在这些属性中, was.appserver.home
, was.appserver.profile.name
, was.appserver.cell.name
, was.appserver.node.name
和was.appserver.server.name
值可根据实际WAS进行was.appserver.server.name
服务器。 您可以从脚本包密钥的相应输入中获取值。 其他属性可以使用默认值,这些默认值显示在先前的属性配置文件中。 以下代码显示了如何在脚本中取消配置数据收集器并卸载用于WebSphere Application Server的APM代理。
#parse WAS_SERVERS_PARM
servers = []
server_tokens = was_servers_param.split(',')
for server_str in server_tokens:
tokens = server_str.split(':')
name = tokens[0]
run_as = 'root'
if len(tokens) > 1 and tokens[1] and tokens[1].strip():
run_as = tokens[1]
auto_restart = 'true'
if len(tokens) > 2 and tokens[2] and tokens[2].strip():
auto_restart = tokens[2]
servers.append({'name':name, 'run_as':run_as, 'auto_restart':auto_restart})
#Create configuration file
p = ConfigParser.ConfigParser()
default_sect ion = 'DEFAULT SECTION'
p.add_section(default_section)
p.set(default_section, 'tema.host','127.0.0.1')
… …
p.set(default_section, 'was.appserver.home',was_home)
p.set(default_section, 'was.appserver.profile.name',was_profile_name)
p.set(default_section, 'was.appserver.cell.name',was_cell_name)
p.set(default_section, 'was.appserver.node.name',was_node_name)
server_section = 'SERVER'
p.add_section(server_section)
for s in servers :
p.set(server_section, 'was.appserver.server.name', s['name'])
p.set(server_section, 'tema.serveralias', s['name'])
with open(config_file, 'w') as f :
p.write(f)
#unconfig data collector , i.e. unconfig.sh -p config.cfg
cmd = '%s/unconfig.sh -p %s'%(os.path.join(dchome, 'bin'), config_file)
maestro.log_call([cmd], shell=True)
#uninstall the agent, i.e. smai-agent.sh force uninstall
cmd = '%s/smai-agent.sh force uninstall_all'%os.path.join(agent_home, 'bin')
maestro.log_call([cmd], shell=True)
该脚本使用smai-agent.sh
脚本来卸载代理。 您还可以使用以下APM命令来卸载代理:
was-agent.sh uninstall
该命令仅除去WebSphere Application Server代理程序的文件。 它将保留APM代理框架文件和目录中安装的其他APM代理。 因为仅WebSphere Application Server代理安装在安装目录中,所以您可以使用smai-agent.sh
脚本来清理整个目录。
该脚本仅卸载APM代理,而不卸载ITCAM代理,因为ITCAM代理具有一组不同的安装和卸载命令及其自己的生命周期。 用户可以手动卸载ITCAM代理。
该代码中使用的maestro.log_call
方法由PureApplication脚本包框架实现并提供。 它用于以安全方式启动本地命令或运行本地脚本。
要从代理程序映像安装代理程序,必须提供要安装的代理程序的类型和安装目录,并且还必须在安装配置文件中接受许可证,如以下示例所示。
License_Agreement="I agree to use the software only in accordance with the installed license."
INSTALL_AGENT=was
AGENT_HOME=/opt/ibm/agent
您可以在从映像中提取的根目录下找到名为APM_silent_install.txt
的安装配置文件模板。 该脚本代替使用模板,而是创建一个用于安装APM代理的新配置文件。
#unzip configured image
temp_dir = tem pfile.mkdtemp()
image_file = tarfile.open(image_path, mode='r:')
image_file.extractall(temp_dir)
image_file.close()
# create APM_silent_install.txt
p = ConfigParser.ConfigParser()
#set properties
… …
with open('%s/APM_silent_install.txt'%temp_dir, 'w') as f :
p.write(f)
# install agent e.g. installAPMAgents.sh -p APM_silent_install.txt
cmd = '%s/APM_Agent_Install_8.1.3/installAPMAgents.sh -p %s/APM_silent_install.txt'%(temp_dir, temp_dir)
maestro.log_call([cmd], shell=True)
配置数据收集器时,该命令将更改WebSphere Application Server的server.xml
文件,以将代理JAR文件添加到WebSphere Application Server进程。 此过程要求配置过程具有对server.xml
文件的写许可权。 否则,配置过程将失败。 可以使用root用户来运行config.sh
脚本,因为该用户通常具有对所有系统文件的足够访问权限,如以下示例所示。
#config data collector , i.e. config.sh -p config.cfg
cmd = "su -c root '%s/config.sh -p %s'"%(os.path.join(dchome, 'bin'), config_file)
maestro.log_call([cmd], shell=True)
但是,对于严格控制文件访问的定制WebSphere Application Server模式,将root用户替换为对server.xml
文件具有写访问权的其他系统用户。
为了使数据收集器正常工作,必须重新启动WAS服务器。 为了保留WebSphere Application Server进程的特权,该脚本使用了首次启动WAS服务器的系统用户。 脚本包属性WAS_SERVERS_PARM将用户标识为"run_as"
参数的值。
某些WebSphere Application Server模式在一个节点上包括多于一个WAS服务器。 例如,业务流程管理器(BPM)模式中的WAS服务器包括Messaging
, Support
, AppTarget
和WebApp
。 如果这些服务器具有依赖性,请考虑重新启动服务器的顺序。 该脚本遵循服务器在脚本包的WAS服务器字符串值中出现的顺序,例如: server1:root
, server2:root
。 该脚本将按以下示例所示的顺序停止并启动server1
和server2
。
for server in servers :
if server['auto_restart'].lower() == 'true' :
cmd = 'su %s -c "%s/bin/stopServer.sh %s"'%(server['run_as'],was_home, server['name'])
maestro.log_call([cmd], shell=True)
cmd = 'su -c "%s/bin/startServer.sh %s"'%(server['run_as'], was_home, server['name'])
maestro.log_call([cmd], shell=True)
如下所述重新启动APM代理,以使数据收集器开始工作。
cmd= '%s/bin/was-agent.sh stop'%agent_home
maestro.log_call([cmd], shell=True)
cmd= '%s/bin/was-agent.sh start'%agent_home
maestro.log_call([cmd], shell=True)
重新启动WAS服务器之后,服务器将尝试在dchome
目录下创建runtime
目录,然后将配置文件写入新目录。 因此, runtime
目录必须具有足够的特权,以run_as
WebSphere Application Server进程的run_as
用户进行读写。 如果为多个WAS服务器配置了不同的run_as
用户,则该脚本会向所有用户提供来自runtime
目录的完全读取/写入权限。
该脚本会进入睡眠模式一段时间。 然后,它更改目录许可权,以允许WAS服务器完成重新启动并创建runtime
目录。
runtime = os.path.join(agent_home,'yndchome', '7.3.0.11.0', 'runtime')
print 'Change the privilege to %s'%runtime
retry = 5
while not os.path.exists(runtime) and retry > 0:
time.sleep(5)
retry –-
if os.path.exists(runtime) :
os.chmod(runtime, 0777)
接下来,创建脚本包以包装元数据和脚本文件,这是PureApplication必需的。 要创建脚本包,请以.zip
或.tgz
格式压缩cbscript.sh
脚本和Python脚本。 确保cbscript.sh
脚本位于包结构的顶层。 另外,在cbscript.sh
脚本中使用为"filename"
定义的值命名压缩文件,即APWAgentWAS.zip
。
或者,您也可以使用PureApplication插件开发套件来帮助制作脚本包。 要了解更多信息,请参阅『 创建IBM Workload Script Package Project』 。
在使用脚本包之前,必须使用APM服务器脚本配置原始APM代理映像。 (要配置映像,请参阅配置安装映像以获取指示信息。)然后,将配置的映像上载到要在其上运行脚本包的目标WAS节点可访问的HTTP服务器。
PureApplication提供了一组授权脚本包。 但是,在使用脚本包之前,必须将其作为客户脚本包导入到PureApplication中。 您还必须将脚本包显式添加到WebSphere Application Server模式中,以便可以在部署和运行模式时执行该脚本包。 以下各节说明如何在WebSphere Application Server模式中导入和使用脚本包。
要在PureApplication System中导入新的脚本包,请从PureApplication Web控制台中,选择目录→脚本包 。 然后,要上传脚本包文件,请单击“ 新建” 。 您以后总是可以上载新的脚本包文件。 创建脚本包后,可以使用此功能以新更改升级脚本。
成功上载脚本包后, cbscript.json
文件中定义的所有属性将显示在脚本包详细信息面板的“环境”部分中。 这些属性以默认值开头。 您可以通过覆盖“添加变量”部分中的属性来重置这些值。 您还可以稍后在将脚本包添加到模式中时甚至在执行脚本包时在运行时重置值。 重置时间具有以下差异:
对于“执行”,请在启动时选择它 (如下图所示),以便在运行时手动触发脚本的执行。 这样,只有在WAS服务器创建并且可以访问之后,才能运行脚本。
成功安装脚本包之后,可以在WebSphere Application Server模式中使用它。 该脚本支持WebSphere Application Server独立拓扑和网络部署拓扑,PureApplication System中的大多数WebSphere Application Server模式都涵盖了这些拓扑。 要将脚本添加到WebSphere Application Server模式:
在节点上激活脚本包后,该脚本包的属性在右窗格中可见。 您可能需要重设WAS_Profile_Name,WAS_Cell_Name,WAS_Node_Name和WAS_Servers_PARM之类的属性,以使其与模式中的WebSphere Application Server软件组件的相应属性一致。 请注意动态创建的服务器以及节点和单元名称的实例ID,主机名或随机数字后附加的名称,因为直到运行时才确定所有名称。 在这种情况下,您需要在执行脚本包时重置与WebSphere Application Server相关的脚本包属性。
部署WebSphere Application Server并使其处于RUNNING状态后,从“虚拟系统实例”页面上的VM角度在WebSphere Application Server虚拟机部分中找到脚本包。 要输入脚本包的属性值,请单击“ 执行”链接,然后为每个属性指定一个适当的值。
要检查脚本包是否成功运行,请下载remote_std_out.log
文件。 如果脚本包失败,请下载remote_std_err.log
文件进行调试和故障排除。
成功运行脚本包后,请登录以下位置的APM门户:
https://
要找到目标WAS服务器以及从WAS服务器收集的度量标准,请执行以下操作:
要查看指标的更多详细信息,请单击“状态概述”页面上的任何图表。
在以下情况下,您必须重新配置甚至重新安装APM代理:
脚本包的实现专为幂等执行而设计。 这意味着,每次运行时,它都从卸载代理开始,并从头开始安装APM代理而结束。 当您要重新配置或升级APM代理时,请使用新配置的映像或重置与WebSphere Application Server相关的属性,以再次运行脚本包。
在某些情况下,以批处理模式执行脚本包有助于在多个WAS节点之间提高安装和配置APM代理的自动化程度。 这种自动化尤其发生在一个WebSphere Application Server模式中的WAS集群的多个WAS节点上,或者在一个WebSphere Application Server模式或多个WebSphere Application Server模式中的多个WAS集群上。 PureApplication System在指定的VM上提供正在执行的脚本包的REST API,以及用于定位VM和特定脚本包的辅助API。 通过编译这些API,您可以制作一个脚本以批处理模式执行脚本包。
下表定义了执行脚本的API。
方法 | 开机自检 |
资源资源 | / resources / virtualSystemInstances / |
要求正文 | 一个JSON对象,其中包含脚本包中必需的属性。 |
路径中包含以下参数:
方法 | 得到 |
---|---|
资源资源 | / resources / virtualSystemInstances / |
响应 | JSON对象包含部署中的虚拟机资源列表。 [ |
API响应包含VM及其属性的列表,包括"id"
。 您可以通过在列表中的虚拟机之间匹配"displayname"
来找到目标虚拟机。 您可以在PureApplication实例控制台的“虚拟机透视图”部分中找到"displayname"
的值,如下图所示。 VM资源中具有匹配的"displayname"
的值"id"
将用于请求中的"vmid"
。
scriptid
,但是可以通过调用以下REST API来获取scriptid
。
方法 | 得到 |
---|---|
资源资源 | / resources / virtualSystemInstances / |
响应 | JSON对象包含部署中虚拟机上的脚本列表。 [ |
响应包含脚本包列表。 与查找vmid
相似,脚本"name"
将帮助您从列表中找到"scriptid"
。
要在多个VM上执行脚本包,将使用一个文件(请参见以下示例)来提供目标部署和VM的标识符。 该文件还提供每个VM上WebSphere Application Server的输入参数的值。
{
"d-7ac772b7-f5c3-4fff-8eac-dd1d53732591": {
"WASStandalone.11469630057527": {
"AGENT_URI": "http://172.16.65.221:8080/artifacts/ipm_monitoring_agent_xlinux_8.1.3.tar",
"AGENT_HOME": "/opt/IBM/apmwas",
"WAS_HOME": "/opt/IBM/WebSphere/AppServer",
"WAS_PROFILE_NAME": "DefaultAppSrv01",
"WAS_CELL_NAME": "CloudBurstCell",
"WAS_NODE_NAME": "CloudBurstNode",
"WAS_SERVERS_PARM": "server1:admin",
"adminusername": "",
"adminpassword": ""
},
" WASStandalone.11469630057528": {
"AGENT_URI": "http://172.16.65.221:8080/artifacts/ipm_monitoring_agent_xlinux_8.1.3.tar",
… …
}
},
"d-7ac772b7-f5c3-4fff-8eac-dd1d5378974": {
"WASStandalone.11469630057527": {
"AGENT_URI": "http://172.16.65.221:8080/artifacts/ipm_monitoring_agent_xlinux_8.1.3.tar",
… …
}
}
}
创建Python脚本(如以下示例所示)以迭代方式启动REST API,以获取"vmid"
和"scriptid"
,并在不同部署的目标VM上执行脚本包。
def local_call(*popenargs, **kwargs):
proc = subprocess.Popen(*popenargs, **kwargs)
out = proc.communicate()[0]
return out
for deployment, instances in deployments :
for instance, param in instances :
#1. gen instance vm id
cmd = 'curl -u "%s:%s" -X GET \
–-url "https://%s/resources/virtualSystemInstances/%s/virtualMachines/"'\
%(user, password, floatip, deployment)
out = local_call([cmd], shell=True)
for o in out :
if o['displayname'] == instance :
vmid = o['id']
break
#2. get script package id
cmd = 'curl -u "%s:%s" -X GET \
--url "https://%s/resources/virtualSystemInstances/%s
/virtualMachines/%s/virtualMachineScripts'"\
%(user, password, floatip, deployment, vmid)
out1 = local_call([cmd], shell=True)
for o1 in out1 :
if o1['name'] == 'Sample Instance APM WAS Agent' :
spid = o1['id']
break
#3. trigger executing the script packages
cmd = 'curl -u "%s:%s" -X POST -d %s \
--url "https://%s/resources/virtualSystemInstances/%s\
/virtualMachines/%s/virtualMachineScripts/%s"'\
%(sys_user, sys_password, json.dumps(param), deployment, vmid, spid)
local_call([cmd], shell=True)
Python脚本可以在可以到达PureApplication System的任何位置运行。 它对可以跨云组分布的目标部署和VM的位置没有限制。 记录PureApplication控制台所需的管理用户名( sys_user
)和密码( sys_password
)来验证对REST API的调用。
该脚本不是使用maestro.log_call
而是实现了自己的local_call
方法来启动curl
命令。 原因是它希望独立运行,而不是在PureApplication脚本包框架上运行。
通过使用脚本包为IBM PureApplication System以虚拟系统模式启用IBM Application Performance Management代理,您可以为工作负载配备最新的APM监视功能和用户体验。 本教程介绍了如何在WebSphere Application Server虚拟系统模式中实现和应用脚本包以安装和配置WebSphere Application Server的APM代理。 通过替换一些命令或定制脚本流,您可以重新使用脚本包来为各种中间件或数据库(例如OS代理,HTTP服务器代理或DB2代理)安装和配置其他APM代理。
感谢Dave Fresquez和Ling Lan在复习本教程方面的专业知识。
翻译自: https://www.ibm.com/developerworks/library/mw-1610-liu-trs/index.html