26. App Package Descriptor
WebApp WAR web.xml
Portlet WAR portlet.xml
EJB JAR ejb-jar.xml
MIDlet JAR MANIFEST
Enterprise App EAR application.xml
MBeans SAR *-service.xml
Connectors RAR
JON Plugin JAR rhq-plugin.xml
26
28. Discovery Component
public class BuscadorDiscovery implements ResourceDiscoveryComponent {
public Set discoverResources(ResourceDiscoveryContext discoveryContext) {
// Implementa a regra de descoberta do Buscador
// (via tabela de processos, arquivo em disco, porta TCP/IP, etc)
// Monta e retorna colecao com os recursos descobertos.
}
}
28
29. Plugin Component
public class BuscadorComponent implements ResourceComponent {
public AvailabilityType getAvailability() {
// Regra para verificar se o recurso esta disponivel ou nao.
}
public void start(ResourceContext context) {
// Inicializa conexao com o rescurso
}
public void stop() {
// Finaliza conexao com o recurso
}
} 29
30. Plugin Component
public class BuscadorComponent implements ResourceComponent,
MeasurementFacet {
public void getValues(MeasurementReport report, Set metrics) {
// Recuperar e armazenar em ‘report’ o valor de
// cada metrica presente em ‘metrics’
}
}
30
32. $ svn co http://anonsvn.jboss.org/repos/jopr/trunk
A trunk/.classpath
A trunk/LICENSE_LGPL
A trunk/LICENSE
A trunk/.project
A trunk/LICENSE_GPL é preciso obter o
A trunk/modules código fonte do Jopr ou
A trunk/modules/plugins do RHQ Project
A trunk/modules/plugins/hibernate
A trunk/modules/plugins/hibernate/src
A trunk/modules/plugins/hibernate/src/test
A trunk/modules/plugins/hibernate/src/test/java
A trunk/modules/plugins/hibernate/src/test/java/org
A trunk/modules/plugins/hibernate/src/test/java/org/rhq
A trunk/modules/plugins/hibernate/src/test/java/org/rhq/plugins
A trunk/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate
...
A trunk/etc/jbas5-ejb-client/src/main/java
A trunk/etc/jbas5-ejb-client/src/main/java/test
A trunk/etc/jbas5-ejb-client/src/main/java/test/EjbClient.java
A trunk/etc/jbas5-ejb-client/pom.xml
A trunk/.settings
A trunk/.settings/org.eclipse.jdt.core.prefs
A trunk/.settings/org.maven.ide.eclipse.prefs
U trunk
Checked out revision 673.
32
34. execute o
gerador de
plugins
$ java -jar rhq-pluginGen-1.2.2-jar-with-dependencies.jar
Please specify the plugin root category PLATFORM(P), SERVER(S), SERVICE(I), i
Please specify its PackagePrefix: br.com.seatecnologia.monitoring.buscador
Please specify its FileSystemRoot: /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins
Please specify its ComponentClass: BuscadorComponent
Please specify its DiscoveryClass: BuscadorDiscovery
Please specify if it should support Events (y/N):
Please specify its ParentType:
Please specify if it should support Monitoring (y/N): y
Please specify if it should support Operations (y/N):
Please specify if it should support Singleton (y/N):
Please specify if it should support ResourceConfiguration (y/N):
Please specify if it should support CreateChildren (y/N):
Please specify if it should support UsesExternalJarsInPlugin (y/N):
Please specify if it should support DeleteChildren (y/N):
Please specify if it should support ManualAddOfChildren (y/N):
Please specify if it should support UsePluginLifecycleListenerApi (y/N):
Please specify its Name: buscador
Please specify its Description: Plugin para acompanhamento da execucao do aplicativo de
simulacao de memory leaks
Do you want to add a child to buscador? (y/N)
Don't forget to add your plugin to the parent pom.xml responda as
questões
34
35. $ ls -1 /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins
JBossOSGi
buscador
hibernate
jboss-as
jboss-as-5 plugin gerado já na pasta
jboss-cache de plugins do Jopr
pluginGen.log
pom.xml
rhq-server
tomcat
$ ls -1 /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins/buscador
pom.xml
src
plugin gerado como
projeto Maven
35
43. src/main/resources/META-INF/rhq-plugin.xml
<plugin-configuration>
<!-- TODO add your own here -->
</plugin-configuration>
comente isto por
enquanto para testarmos
apenas o build e deploy
do plugin
<!-- plugin-configuration>
<!- TODO add your own here ->
</plugin-configuration -->
41
45. mvn package
[INFO] Failed to resolve artifact.
GroupId: org.rhq erro ao
ArtifactId: rhq-plugins-parent executar o
Version: 1.2.0-SNAPSHOT ‘mvn package’
Reason: Unable to download the artifact from any repository
<parent>
<groupId>org.rhq</groupId>
<artifactId>rhq-plugins-parent</artifactId>
<version>1.2.0-SNAPSHOT</version><!-- TODO adjust RHQ version -->
</parent>
pom.xml
lib requerida
pelo plugin
gerado
43
47. repositório oficial
não possui a versão
1.2.0-SNAPSHOT
repositório de
snapshots até
possui a versão
1.2.0-SNAPSHOT,
mas já estão
desenvolvendo a
1.3.0-SNAPSHOT
45
48. pom.xml
alteração da
versão da lib
<parent>
<groupId>org.rhq</groupId>
<artifactId>rhq-plugins-parent</artifactId>
<version>1.2.0.GA</version><!-- TODO adjust RHQ version -->
</parent>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.org/maven2/</url>
</repository>
</repositories>
inclusão de um dos
repositórios do JBoss
46
50. Deploy
jopr/trunk/modules/plugins/buscador alegomes$
cp target/buscador-plugin-1.2.0.GA.jar
~/JavaTools/jon-server-2.2.0.GA/jbossas/server/
default/deploy/rhq.ear/rhq-downloads/rhq-plugins/
06:05:33,763 INFO [ProductPluginDeployer] Discovered agent plugin [buscador]
06:05:34,406 INFO [ProductPluginDeployer] Deploying [1] new or updated agent plugins: [buscador]
log do jon-server
48
51. ./rhq-server.sh console
...
07:22:52,375 INFO [EARDeployer] Init J2EE application: file:/Volumes/Data/Applications/JavaTools/
jon-server-2.2.0.GA/jbossas/server/default/deploy/rhq.ear/
07:23:01,581 INFO [SchedulerService] Scheduler has a default operation timeout of [600] seconds.
07:23:03,094 INFO [CoreServer] Version=[1.2.0.GA], Build Number=[3862], Build Date=[27.Apr.2009
16.56.25 EDT]
07:23:20,790 INFO [ProductPluginDeployer] Discovered agent plugin [buscador]
07:23:22,726 INFO [ProductPluginDeployer] Discovered agent plugin [Hibernate]
07:23:24,821 INFO [ProductPluginDeployer] Discovered agent plugin [JBossAS]
07:23:25,988 INFO [ProductPluginDeployer] Discovered agent plugin [RHQServer]
07:23:27,329 INFO [ProductPluginDeployer] Discovered agent plugin [RHQAgent]
07:23:28,437 INFO [ProductPluginDeployer] Discovered agent plugin [Apache]
07:23:29,579 INFO [ProductPluginDeployer] Discovered agent plugin [Database]
07:23:30,776 INFO [ProductPluginDeployer] Discovered agent plugin [IIS]
07:23:31,938 INFO [ProductPluginDeployer] Discovered agent plugin [JMX]
07:23:32,947 INFO [ProductPluginDeployer] Discovered agent plugin [Platforms]
07:23:33,940 INFO [ProductPluginDeployer] Discovered agent plugin [Postgres]
07:23:34,366 INFO [PersistenceUnitDeployment] Starting persistence unit
persistence.units:ear=rhq.ear,unitName=rhqpu
07:23:34,786 INFO [Version] Hibernate EntityManager 3.2.1.GA
...
49
52. sudo ./rhq-agent.sh
rhq-agent-jon-2.2.0/bin alegomes$ sudo ./rhq-agent.sh
RHQ 1.2.0.GA [3862] (Mon Apr 27 17:55:22 BRT 2009)
>
> plugins info
Plugins that are currently installed:
jopr-hibernate-plugin-2.2.0.GA.jar
Plugin Name: Hibernate
Last Updated: May 27, 2009 6:38:29 PM BRT
File Size: 11,008 bytes
MD5 Hashcode: d8540d9ff5e15867f7e19bd755fe1afe
...
rhq-postgres-plugin-1.2.0.GA.jar
Plugin Name: Postgres
Last Updated: May 27, 2009 6:38:26 PM BRT
File Size: 475,851 bytes
MD5 Hashcode: 7049b7b7d33ec5f5ebb903ffdb9f5e85
Total number of plugins currently installed: [10]
> 50
53. sudo ./rhq-agent.sh
> plugins update
The plugin container has been stopped.
Updating plugins to their latest versions.
The plugin [buscador-plugin-1.2.0.GA.jar] has been updated.
Completed updating the plugins to their latest versions.
The plugin container has been started.
>
51
54. sudo ./rhq-agent.sh
> plugins info
Plugins that are currently installed:
buscador-plugin-1.2.0.GA.jar
Plugin Name: buscador
Last Updated: May 29, 2009 7:29:26 AM BRT
File Size: 6,567 bytes
MD5 Hashcode: 2bd7e8dcbd206ee56a9aec9f6b9b6e6d
jopr-hibernate-plugin-2.2.0.GA.jar
Plugin Name: Hibernate
Last Updated: May 27, 2009 6:38:29 PM BRT
File Size: 11,008 bytes
MD5 Hashcode: d8540d9ff5e15867f7e19bd755fe1afe
...
rhq-postgres-plugin-1.2.0.GA.jar
Plugin Name: Postgres
Last Updated: May 27, 2009 6:38:26 PM BRT
File Size: 475,851 bytes
MD5 Hashcode: 7049b7b7d33ec5f5ebb903ffdb9f5e85
Total number of plugins currently installed: [11] 52
56. Discovery Component
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
public class BuscadorDiscovery implements ResourceDiscoveryComponent {
public Set discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception {
// Todos os recursos descobertos serao agrupados neste conjunto
Set discoveredResources = new HashSet();
// Implementa a regra de descoberta do Buscador
// (via tabela de processos, arquivo em disco, porta TCP/IP, etc)
// Cria objeto que represente o recurso descoberto
DiscoveredResourceDetails detail = .....;
// Adicione cada um dos recursos descobertos ao resultado
discoveredResources.add(detail);
return discoveredResources;
}
54
57. Process Scan
Process Info Query Language
Process|basename|match=^java.*,arg|org.jboss.Main|match=.*
process|pidfile|match=/etc/product/lock.pid
List<ProcessScanResult> autoDiscoveryResults = context.getAutoDiscoveredProcesses();
for (ProcessScanResult result : autoDiscoveryResults) {
ProcessInfo procInfo = result.getProcessInfo();
...
DiscoveredResourceDetails detail =
new DiscoveredResourceDetails( resourceType, key, name, null,
description, childConfig, procInfo );
result.add(detail);
}
Discovery Component 55
59. Plugin Component
public class BuscadorComponent implements ResourceComponent {
public AvailabilityType getAvailability() {
// Regra para verificar se o recurso esta disponivel ou nao.
return AvailabilityType.UP;
}
public void start(ResourceContext context) throws Exception {
// Inicializa conexao com o rescurso
}
public void stop() {
// Finaliza conexao com o recurso
}
} 57
60. Plugin Component
public class BuscadorComponent implements ResourceComponent, MeasurementFacet {
/**
* Coleta valores das metricas mapeadas no descritor
*/
public void getValues(MeasurementReport report, Set metrics) throws Exception {
for (MeasurementScheduleRequest metrica : metrics) {
if (metrica.getName().equals("umaMetricaQualquer")) {
MeasurementDataNumeric valor = null;
valor = new MeasurementDataNumeric(metrica, Double.valueOf(VALOR_QUALQUER));
report.addData(valor);
}
// Fazer a mesma coisa para as outras metricas
}
} 58
67. Operation Facet
<operation name="start" displayName="Start"
description="Start this application server.
The script used is specified in the Operations
group of connection properties.">
<results>
<c:simple-property name="operationResult"
description="Outcome of starting the server."/>
</results>
</operation>
public OperationResult invokeOperation(String name, Configuration configuration) throws InterruptedException {
JBossASServerSupportedOperations operation =
Enum.valueOf(JBossASServerSupportedOperations.class,
name.toUpperCase());
return operationsDelegate.invoke(operation, configuration);
}
65
69. Event Facet
<event name="logEntry" description="an entry in a log file"/>
public void start(ResourceContext context) throws Exception {
...
this.logFileEventDelegate = new LogFileEventResourceComponentHelper(this.resourceContext);
this.logFileEventDelegate.startLogFileEventPollers();
}
public void stop() {
this.logFileEventDelegate.stopLogFileEventPollers();
...
}
67
70. Baixe, instale e configure o Maven
Baixe e descompacte o código fonte do Jopr
Baixe e execute o gerador de plugins
Faça o deploy do plugin gerado
Experimente a PIQL
Explore suas facetas
68
71. JUST DO IT
69
Sugestão: inspire-se no exemplo RHQ_httptest2.zip, disponível no servidor.
Os 3 conceitos principais do JON s&#xE3;o:
- Plataforma: Dell 3.4Ghz 4GB RAM...
- Servidores: JBoss, Apache, IIS, Postgres...
- Servi&#xE7;o: EJB, Datasource, WebApp...
Todos os 3 elementos s&#xE3;o chamados de &#x2018;recurso&#x2019;.
Qualquer recurso pode ter um recurso pai e v&#xE1;rios recursos filhos.
O servidor JBoss AS &#xE9; recurso filho da plataforma iMac. A plataforma iMac &#xE9; recurso pai do servidor JBoss AS. Os servi&#xE7;os EJBs, WebApps e Datasource s&#xE3;o recursos filhos do servidor JBoss AS. O servidor JBoss AS &#xE9; recurso pai dos servi&#xE7;os EJB, WebApp e Datasource.
Conceitos: Recurso, Categoria e Tipo
Por exemplo, uma plataforma Linux tem X m&#xE9;tricas dispon&#xED;veis, enquanto um servidor JBoss tem Y m&#xE9;tricas, totalmente diferente daquelas X.
Reparem que o conjunto de m&#xE9;tricas da plataforma &#xE9; diferente do conjunto de m&#xE9;tricas do servidor.
O conjunto de opera&#xE7;&#xF5;es tambem diferem de um tipo de recurso para outro.
Por exemplo, por que o PostgreSQL &#xE9; detectado na plataforma e o MySQL, n&#xE3;o?
Relembrando a arquitetura do JON:
- Um &#xFA;nico jon-server &#xE9; necess&#xE1;rio.
- Um jon-agent deve ser instalado em cada m&#xE1;quina a ser monitorada.
- O jon-server comunica-se com v&#xE1;rios jon-agents, e vice-versa.
O jon-agent busca no ambiente em que foi instalado por todos servi&#xE7;os que reconhece. Se o administrador do JON, pela interface do jon-server, solicitar a monitora&#xE7;&#xE3;o dos recursos identificados pelo jon-agent, o agente inicia a coleta peri&#xF3;dica de dados de cada servi&#xE7;o descoberto.
O elemento central do agente do JON s&#xE3;o seus plugins. Cada plugin &#xE9; respons&#xE1;vel pela descoberta e monitora&#xE7;&#xE3;o de um tipo espec&#xED;fico de recurso.
O que define o poder do JON &#xE9; o conjunto de plugins dispon&#xED;vel em seus agentes. Ou seja, se existir um plugin do JON espec&#xED;fico para Oracle, o Oracle ser&#xE1; monitorado. Caso contr&#xE1;rio, n&#xE3;o ser&#xE1;.
Qualquer pessoa pode desenvolver e acrescentar novos plugins ao JON.
Basta utilizar a API definida no projeto RHQ.
E a&#xED; &#xE9; poss&#xED;vel realizar o monitoramento de atividades de neg&#xF3;cio, extraindo m&#xE9;tricas estrat&#xE9;gicas para a monitora&#xE7;&#xE3;o das atividades corporativas e apoio &#xE0; tomada de decis&#xF5;es gerenciais.
Todo plugin pode fazer 3 coisas...
Essas 3 coisas s&#xE3;o chamadas de facetas (facets) do plugin.
Cada uma dessas 3 coisas &#xE9; implementada de forma independente.
Para que essas 3 coisas sejam feitas, &#xE9; preciso...
Descritores fazem parte da cultura Java.
Pra cada tipo de pacote Java existe um tipo espec&#xED;fico de descritor.
Esta &#xE9; a estrutura do plugin descriptor. Apresentar:
- Depend&#xEA;ncias de um plugin com outros
- Sequ&#xEA;ncia de plataformas, servidores e servi&#xE7;os
- Cada tipo de recurso deve ter um nome &#xFA;nico no plugin
- Para cada tipo de recurso, define-se a l&#xF3;gica de descoberta, as m&#xE9;tricas e opera&#xE7;&#xF5;es suportadas, dentre outros.
O Discovery Component &#xE9; invocado periodicamente pelo agente.
Ap&#xF3;s a descoberta, o Plugin Component entra em a&#xE7;&#xE3;o para coleta de m&#xE9;tricas, execu&#xE7;&#xE3;o de opera&#xE7;&#xF5;es, etc.
Para cada fun&#xE7;&#xE3;o b&#xE1;sica do plugin, &#xE9; necess&#xE1;ria a implementa&#xE7;&#xE3;o de uma faceta espec&#xED;fica.
Cada faceta corresponde a uma interface espec&#xED;fica a ser implementada pelo desenvolvedor do plugin.
Por conveni&#xEA;ncia..
J&#xE1; at&#xE9; tinha o reposit&#xF3;rio no profile dev, mas seria mais coisa a explicar...
O projeto Maven do plugin extende o projeto Maven ajopr-2/modules/plugins/teste2 todos os plugins.
Altera&#xE7;&#xE3;o no pom.xml
Altera&#xE7;&#xE3;o no pom.xml
Build
Deploy
O Discovery Component &#xE9; invocado periodicamente pelo agente.
Ap&#xF3;s a descoberta, o Plugin Component entra em a&#xE7;&#xE3;o para coleta de m&#xE9;tricas, execu&#xE7;&#xE3;o de opera&#xE7;&#xF5;es, etc.
Para cada fun&#xE7;&#xE3;o b&#xE1;sica do plugin, &#xE9; necess&#xE1;ria a implementa&#xE7;&#xE3;o de uma faceta espec&#xED;fica.
Cada faceta corresponde a uma interface espec&#xED;fica a ser implementada pelo desenvolvedor do plugin.