Table of Contents Previous Next PDF


Creating an Oracle TSAM Agent Custom Plug-in

Creating an Oracle TSAM Agent Custom Plug-in
This chapter contains the following sections:
Overview
Tuxedo has a built-in plug-in framework that facilitates additional functionality. For example, the Tuxedo security mechanism is constructed on the plug-in framework. Tuxedo defines an interface set as a contract between a service provider and end user. The term “service” here is used as a general term; not a Tuxedo ATMI service. Oracle TSAM Agent also use the Tuxedo plug-in framework to attach different data receivers.
Tuxedo Plug-in Framework Concepts
The following section highlights Oracle Tuxedo plug-in framework key concepts.
Interface
An Interface is the contract format between the plug-in implementation and the plug-in caller. An interface requires the following attributes:
The interface ID is the name of the interface that is uniquely identified in the Tuxedo plug-in framework and uses the following format:
<interface id> ::= <component name>[/<sub-component/name>]/<interface name>
The Oracle TSAM Agent plug-in uses the following format:
engine/performance/monitoring
An interface has two versions, the major version number and minor version number.
The data structure defines the concrete information conveyed between plug-in caller and implementation.The function declaration defines the routines must be implemented by plug-in.
Implementation
A plug-in is a dynamic library written in C code. The library implements the methods specified by the interface. The Tuxedo plug-in framework supports multiple implementations (interceptors) for one interface.
Tuxedo supports two types of interceptors: Fan-out interceptors and Stack interceptors. The Oracle TSAM Agent uses the Fan-out interceptors. Figure 3‑1 displays the Oracle TSAM Agent plug-in architecture.
Figure 3‑1 Oracle TSAM Agent Plug-in Architecture
When the Tuxedo infrastructure invokes plug-in A method X, plug-in A invokes method X of the intercepting plug-ins in the order specified by the InterceptionSeq attribute as follows:
Plug-in n method X is invoked
Plug-in n method X of is returned
All plug-ins involved in the interceptor implement the same interface. Multiple occurrences of the same plug-in are not allowed in an interception sequence.
Oracle TSAM Agent provides the Fan-out plug-in which allows you to write/create an interceptor plug-in.
Plug-in Register/Un-register/Modifications
Once the plug-in written it must be registered in the Tuxedo registry so that the functional components will locate the plug-in and invoke the appropriate methods. Tuxedo provides three commands specifically for plug-in use:
epifreg: registers a plug-in
epifunreg: un-registers a plug-in
epifregedt: edits a plug-in
Developing a Oracle TSAM Agent Plug-in
Oracle TSAM Agent plug-in invocation begins at the monitoring points. The Oracle TSAM Agent collects and computes the metrics, and composes the arguments passed to the plug-in. The Oracle TSAM Agent Fan-out plug-in invokes the interceptor plug-in according to the registration sequence.
A simple Oracle TSAM custom plug-in development example is provided as a guideline. The system environment is Solaris on Sparc. The functionality is basic and just prints out the metrics buffers. This plug-in works together with the Oracle TSAM Agent default plug-in.
1.
2.
3.
4.
5.
Create Plug-in Source Code
Listing 3‑1 displays an example of the Oracle TSAM plug-in customplugin.c.
Listing 3‑1 Oracle TSAM Agent customplugin.c Plug-in Source Code Example
#include <e_pif.h>
#include <tpadm.h>
#include <fml32.h>
#include <e_perf_mon.h>

static TM32I _TMDLLENTRY print_app(
       perf_mon_1 *,
       FBFR32 **,
       MONITORCTL *,
       TM32U);

static TM32I _TMDLLENTRY print_svc(
       perf_mon_1 *,
       FBFR32 **,
       MONITORCTL *,
       TM32U);

static TM32I _TMDLLENTRY print_sys(
       perf_mon_1 *,
       FBFR32 **,
       MONITORCTL *,
       TM32U);

static TM32I _TMDLLENTRY print_tran(
       perf_mon_1 *,
       FBFR32 **,
       MONITORCTL *,
       TM32U);

static TM32I _TMDLLENTRY plugin_destroy (
       _TCADEF,
       const struct _e_pif_instance_handles *,
       TM32U);

static TM32I _TMDLLENTRY plugin_copy (_TCADEF,
       void *,
       const struct _e_pif_interception_data *,
       struct _e_pif_instance_handles *,
       TM32U);

static const perf_mon_1 Vtblperfapp_1 = {
       print_app,
       print_svc,
       print_sys,
       print_tran,
};

static const _e_pif_plugin_info perf_mon_1_info = {
       { 1, 0 }, /* interface major version */
       { 1, 0 }, /* implementation */
       "abc/tuxedo/tsam", /* implementation id */
       ED_PERF_MON_INTF_ID, /* interface id */
       4, /* virtual table size */
       "ABC, Inc.", /* vendor */
       "Custom Plug-in for Oracle TSAM", /* product name */
       "1.0", /* vendor version */
       EF_PIF_SINGLETON, /* m_flags */
       plugin_destroy,
       plugin_copy
};

int _TMDLLENTRY
plugin_entry(_TCADEF, const char *pIId,
       const char *pImplId,
       const struct _e_pif_iversion *version,
       const struct _e_pif_data *pData,
       const struct _e_pif_interception_data *pInterceptionData,
       struct _e_pif_instance_handles *pI,
       TM32U flags)
{
       const char * const * regData = pData->regdata;
        char *logfile = NULL;
       
       pI->pVtbl = (void *) &Vtblperfapp_1;
       pI->pPluginInfo = (_e_pif_plugin_info *) &perf_mon_1_info;
       pI->pPrivData = NULL;
return (EE_SUCCESS);
}


static TM32I _TMDLLENTRY
plugin_destroy (_TCADEF, const struct _e_pif_instance_handles *pIhandles,
       TM32U flags)
{
       return(EE_SUCCESS);
}


static TM32I _TMDLLENTRY
plugin_copy (_TCADEF, void *iP,
       const struct _e_pif_interception_data *pInterceptionData,
       struct _e_pif_instance_handles *pIhandles,
       TM32U flags)
{
       return(EE_SUCCESS);
}
static TM32I _TMDLLENTRY print_app(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}

static TM32I _TMDLLENTRY print_svc(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}

static TM32I _TMDLLENTRY print_sys(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}
static TM32I _TMDLLENTRY print_tran(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}
 
Build the Plug-in
cc -c customplugin.c -I$TUXDIR/include
cc -G -KPIC -o customplugin.so -L$TUXDIR/lib -lfml customplugin.o
Register the Plug-in
To register the plug-in, do the following steps:
1.
2.
3.
sh ./reg.sh
4.
Listing 3‑2 displays an example of the reg.sh shell script
Listing 3‑2 reg.h Shell Script
#!/bin/sh
epifreg -r -p abc/tuxedo/tsam -i engine/performance/monitoring \
-o SYSTEM -v 1.0 \
-f $APPDIR/customplugin.so -e plugin_entry
epifregedt -s -k "SYSTEM/impl/bea/performance/monfan" \
-a InterceptionSeq=bea/performance/monshm \
-a InterceptionSeq=abc/tuxedo/tsam \
 
Enable Oracle TSAM Monitoring
Enable Oracle TSAM Monitoring by defining the proper monitoring policy through Oracle TSAM console
For more information, see the Oracle TSAM Administration Guide and Oracle TSAM Users Guide.
Run a Call and Check the Standard Output.
You will find the metrics collected printed out.
Listing 3‑3 displays the metrics print out.
Listing 3‑3 Metrics Print Out Example
TA_MONDEPTH 1
TA_MONSTATUS 1
TA_MONPROCTYPE 2
TA_PID 2459
TA_SRVID 10
TA_MONLOGTIMESEC 1259292914
TA_MONLOGTIMEUSEC 26411
TA_MONFIELDSMAP1 -1
TA_MONFIELDSMAP2 -1
TA_MONMSGSIZE 24
TA_MONMSGQUEUED 0
TA_MONLASTTIMESEC 1259292914
TA_MONLASTTIMEUSEC 26411
TA_MONSTARTTIMESEC 1259292914
TA_MONSTARTTIMEUSEC 10500
TA_MONELAPSETIME 15
TA_DOMAINID dom2:bjsol16:66536
TA_GROUPNAME ATMIGRP1
TA_LMID L1
TA_MONTYPE APP
TA_MONCORRID dom2:bjsol16:66536 L1 tuxclient 2478 1 1 1259292909
TA_MONMSGTYPE ARQ
TA_MONSTAGE Q2ME
TA_MONSVCNAME I_TOUPPER
TA_MONHOSTSVC I_TOUPPER
TA_MONSVCSEQ INITIATOR-I_TOUPPER-11659-0
TA_MONPSVCSEQ INITIATOR
TA_MONQID 1879048194-00010.00010
TA_MONPROCNAME tux_atmi_svr

TA_MONDEPTH 1
TA_MONSTATUS 1
TA_MONPROCTYPE 2
TA_PID 2459
TA_SRVID 10
TA_MONLOGTIMESEC 1259292914
TA_MONLOGTIMEUSEC 29368
TA_MONFIELDSMAP1 -1
TA_MONFIELDSMAP2 -1
TA_MONMSGSIZE 100
TA_MONLASTTIMESEC 1259292914
TA_MONLASTTIMEUSEC 29368
TA_MONSTARTTIMESEC 1259292914
TA_MONSTARTTIMEUSEC 10500
TA_MONERRNO 0
TA_MONURCODE 1
TA_MONELAPSETIME 18
TA_DOMAINID dom2:bjsol16:66536
TA_GROUPNAME ATMIGRP1
TA_LMID L1
TA_MONTYPE APP
TA_MONCORRID dom2:bjsol16:66536 L1 tuxclient 2478 1 1 1259292909
TA_MONMSGTYPE ARP
TA_MONSTAGE ME2Q
TA_MONSVCNAME I_TOUPPER
TA_MONHOSTSVC I_TOUPPER
TA_MONSVCSEQ INITIATOR-I_TOUPPER-11659-0
TA_MONPSVCSEQ INITIATOR
TA_MONPROCNAME tux_atmi_svr
 
Oracle TSAM Agent Plug-in Interface
All Oracle TSAM Plug-in interface contents are defined in the $TUXDIR/include/e_perf_mon.h file. When you build a Oracle TSAM Plug-in, this file must be included in your plug-in source code
. The $TUXDIR/include/e_perf_mon.h file definitions are as follows:
Version and Interface Identifier
Listing 3‑4 provides a version and identifier example.
Listing 3‑4 Version and Interface Identifier
#define ED_PERF_MON_MAJOR_VERSION 1
#define ED_PERF_MON_MINOR_VERSION 0
/* Interfaces defined in this module */
#define ED_PERF_MON_INTF_ID "engine/performance/monitoring"
Value Definitions and Data Structure
 
Listing 3‑5 displays the Oracle TSAM framework and plug-in core data structure.
Listing 3‑5 Core Data Structure
typedef struct {
unsigned char fieldsmap[MAXMAPSIZE];
char monitoring_policy[MAXPOLICYLEN]; /* monitor policy */
char corr_id[MAXCORRIDLEN]; /* plug-in supplied correlation ID */
int ulen;
void * udata;
long mon_flag;
} MONITORCTL;
 
Table 3‑1 lists the MONITORCTL members.
 
Table 3‑1 MONITORCTL Members
Table 3‑2 lists the MONITORCTL array size definitions. Table 3‑3 lists the mon_flag Values.
 
 
Table 3‑3 mon_flag Values
Function Table
Listing 3‑6 defines the plug-in implementation method function table.
Listing 3‑6 Plug-in Implementation Method Function Table
typedef struct perf_mon_1_Vtbl {
       TM32I (_TMDLLENTRY *_ec_perf_mon_app) _((
                        struct perf_mon_1_Vtbl * ip,
                        FBFR32 **buf,
                        MONITORCTL *mon_ctl,
                        TM32U flags
       ));
       TM32I (_TMDLLENTRY *_ec_perf_mon_svc) _((
                        struct perf_mon_1_Vtbl * ip,
                        FBFR32 **buf,
                        MONITORCTL *mon_ctl,
                        TM32U flags
       ));
       TM32I (_TMDLLENTRY *_ec_perf_mon_sys) _((
                        struct perf_mon_1_Vtbl * ip,
                        FBFR32 **buf,
                        MONITORCTL *mon_ctl,
                        TM32U flags
       ));
       TM32I (_TMDLLENTRY *_ec_perf_mon_tran) _((
                        struct perf_mon_1_Vtbl * ip,
                        FBFR32 **buf,
                        MONITORCTL *mon_ctl,
                        TM32U flags
       ));
} perf_mon_1, *perf_mon_1_ptr;
 
Each method corresponds to a monitoring type. “_ec_perf_mon_app” is for call path monitoring, “_ec_perf_mon_svc” is for service monitoring, “_ec_perf_mon_sys” is for system server monitoring and “_ec_perf_mon_tran” is for transaction monitoring. Each method will be invoked at the corresponding monitoring type’s monitoring points.The method arguments are:
struct perf_mon_1_Vtbl *ip: the virtual table pointer e.
Note:
FBFR32 **buf: the address of the metrics buffer in FML32 type.
MONITORCTL *mon_ctl: the control structure.
TM32U flags: the bit flag in a 32-byte, unsigned integer.
Other Help Header Files
The Tuxedo general plug-in definition file. It must be included in the plug-in source code.
It is the Tuxedo built-in FML32 fields definition files. All performance metrics are defined as FML32 fields and some performance metrics are defined in this file
The TSAM built-in FML32 fields definition files. All performance metrics are defined in this file beside the tpadm.h
The metrics collected are stored in a Tuxedo FML32 buffer. To access these items, FML32 routines must be used; fml32.h must be included.
Oracle TSAM Agent Plug-in Implementation
Oracle TSAM Agent plug-in implementation requires the following steps:
1.
2.
3.
Define “perf_mon_1” in the “e_perf_mon.h” Function Table
Listing 3‑7 shows a perf_mon_1 defined in the e_perf_mon.h function table example.
Listing 3‑7 Define a "perf_mon_1" defined in "e_perf_mon.h" Function Table
static const perf_mon_1 Vtblperfapp_1 = {
       print_app,
       print_svc,
       print_sys,
       print_tran,
};
 
Define the Plug-in Information Variable
Listing 3‑8 shows how to define the plug-in information variable.
Listing 3‑8 Define the Plug-in Information Variable
static const _e_pif_plugin_info perf_mon_1_info = {
       { 1, 0 }, /* interface version */
       { 1, 0 }, /* implementation version */
       "abc/tuxedo/tsam", /* implementation id */
       ED_PERF_MON_INTF_ID, /* interface id */
       4, /* virtual table size */
       "ABC, Inc.", /* vendor */
       "Custom Plug-in for Oracle TSAM", /* product name */
       "1.0", /* vendor version */
       EF_PIF_SINGLETON, /* m_flags */
       plugin_destroy,
       plugin_copy
};
 
The changeable members are “implementation version”, “implementation id”, “vendor”, “product name”, “vendor version”. Other items must be kept with same with the sample.
plugin_destroy and plugin_copy are the general Tuxedo plug-in routines for destroy and copy. For a Oracle TSAM Plug-in, you can write two empty functions as shown in Listing 3‑9.
Listing 3‑9 plugin_destroy and plugin_copy
static TM32I _TMDLLENTRY
plugin_destroy (_TCADEF, const struct _e_pif_instance_handles *pIhandles, TM32U flags)
{
       return(EE_SUCCESS);
}
static TM32I _TMDLLENTRY
plugin_copy (_TCADEF, void *iP,
       const struct _e_pif_interception_data *pInterceptionData,
       struct _e_pif_instance_handles *pIhandles, TM32U flags)
{
       return(EE_SUCCESS);
}
 
Write the Plug-in Entry Routine
Each plug-in must have an “entry” routine and specified in plug-in registration process. In this routine, the virtual function table and plug-in information structure must be supplied to the plug-in instance handler.
Listing 3‑10 shows a plug-in routine example.
Listing 3‑10 Plug-in Entry Routine
int _TMDLLENTRY
plugin_entry(_TCADEF, const char *pIId,
       const char *pImplId,
       const struct _e_pif_iversion *version,
       const struct _e_pif_data *pData,
       const struct _e_pif_interception_data *pInterceptionData,
       struct _e_pif_instance_handles *pI,
       TM32U flags)
{
const char * const * regData = pData->regdata;
char *logfile = NULL;
       pI->pVtbl = (void *) &Vtblperfapp_1;
       pI->pPluginInfo = (_e_pif_plugin_info *) &perf_mon_1_info;
       pI->pPrivData = NULL;
       return (EE_SUCCESS);
}
 
Note:
Writing Concrete Plug-in Implementations
The implementation function table is registered to Tuxedo in the “entry” routine. Then following chapters will focus on how to write TSAM plug-in based on the corresponding monitoring types.
WARNING:
Do not make Tuxedo ATMI calls (except for FML32 operations, tpalloc/tprealloc/tpfree and tptypes) in the plug-in. It may result un-expected behavior as Tuxedo context may be compromised.
Call Path Monitoring Plug-in Routine
The call path monitoring plug-in routine are invoked at the monitoring points. For more information, see “Oracle TSAM Agent Data Collection Framework” on page 2‑1.
A Basic Implementation
In this example, the routine prints out the passed FML32 buffer:
static TM32I _TMDLLENTRY print_app(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}
Understanding Current Monitoring Points
Call path monitoring is the most comprehensive Tuxedo application interceptor. It provides a variety of metrics for recording and analysis.
The monitoring stage itself is a metric with the FML32 field name TA_MONSTAGE. Table 3‑4 lists TA_MONSTAGE values.
 
Table 3‑4 TA_MONSTAGE Values
Listing 3‑11 displays a judge monitoring stage example.
Listing 3‑11 Judge Monitoring Stage
{
       char *stage;
       FLDLEN32 len;
       stage = Ffind32(*obuf, TA_MONSTAGE,0,&len);
       if (stage != NULL ) {
              if (strcmp(stage,”STMO”) == 0 ) {
                     /* ... */
              }else if (strcmp(stage,”Q2ME” == 0 ) {
                     /* ... */
              
              /* other processment */
       }              
}
 
For “STRING” field type, we recommend to use “Ffind32” routine to get a more fast process.
For an application message transmitted in Tuxedo system, it has two choice, request message or reply message. The field TA_MONMSGTYPE indicates the message type.
Table 3‑5 lists the TA_MONMSGTYPE values.
 
The monitoring points always are located in processes of Tuxedo applications. So understand current process is important. Oracle TSAM framework uses the fields TA_DOMAINID, TA_PID, TA_LMID,TA_MONPROCNAME,TA_GROUPNAME and TA_SRVID (as defined in Table 3‑6) to tell the process location.
 
Note:
Check Commonly Used Metrics
After get the necessary information on the monitoring stage, message type and process location, the next step is to check the common used metrics also carried in the FML32 buffer. The metrics will be available depending on the conditions mentioned previously.
Table 3‑7 lists the commonly used metrics.
 
All1

1
For some self-describe buffer types, such as STRING, the size might be zero.

Generate Call Path Correlation ID
The correlation ID must be given by the plug-in at the monitoring initiating stage, which is the TA_MONSTAGE value is “STMO”. The Oracle TSAM framework sets PI_CORRID_REQUIRED in the MONITORCTL mon_flag. If no correlation ID is given, an error is reported. The Oracle TSAM default plug-in provides the correlation ID also. Two scenarios need to consider,
The custom plug-in can skip the correlation ID generation. If the custom plug-in wants to overwrite the correlation ID generated by the Oracle TSAM default plug-in, the interceptor sequence of custom plug-in must come after the Oracle TSAM default plug-in.
If the Oracle TSAM default plug-in is removed from the Tuxedo plug-in framework, the custom plug-in must supply the correlation ID i. For example:
if (monctl->mon_flag & PI_CORRID_REQUIRED) {
       strcpy(monctl->corr_id, mygetid());
}
mygetid()” is an assumed ID generation routine. The length of the new ID must not exceed the size of corr_id of MONITORCTL.
To help ID generation, the custom plug-in can use a Oracle TSAM framework service to get a correlation ID. Listing 3‑12 displays an ID generation example.
Listing 3‑12 ID Generation Example
extern int _TMDLLENTRY tmmon_getcorrid(char *obuf, int len);
...
if (monctl->mon_flag & PI_CORRID_REQUIRED) {
       char new_corrid[MAXCORRIDLEN];
       if (tmmon_getcorrid(new_corrid, sizeof(new_corrid)) == 0 ) {
              strpcy(monctl->corr_id,new_corrid);
       }
}
...
 
Note:
Service Monitoring Plug-in Routine
Service monitoring is a straightforward procedure. The data collection points are before and after the service routine invocation. The plug-in is invoked when a request is to be executed and a reply to be sent back to client.
A Basic Implementation
In this example, the routine prints out the passed FML32 buffer:
static TM32I _TMDLLENTRY print_svc(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}
.
Check Commonly Used Metrics
Table 3‑8 lists the service monitoring plug-in routine metrics.
 
System Server Monitoring Plug-in Routine
Oracle TSAM supports several types of Oracle Tuxedo system servers monitoring: GWTDOMAIN, BRIDGE, and GWWS. The monitoring focus on the throughput, outstanding request number and message number queued on network. The plug-in is invoked periodically by the Oracle TSAM framework. The interval is specified by the monitoring policy. Data collection occurs on the on-going server operations.
A Basic Implementation
In this example, the routine prints out the passed FML32 buffer:
static TM32I _TMDLLENTRY print_sys(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}
Check Commonly Used Metrics
Table 3‑9 lists the system server monitoring plug-in routine metrics.
 
Transaction Monitoring Plug-in Routine
Oracle TSAM also traces critical routines invocation in XA transaction. The scope includes tpbegin,tpcommit, tpabort,xa_xxx calls and GWTDOMAINS transaction routines.
A Basic Implementation
In this example, the routine prints out the passed FML32 buffer:
static TM32I _TMDLLENTRY print_tran(perf_mon_1 * ip,FBFR32 **buf, MONITORCTL * monctl, TM32U flags)
{
       Fprint32(*buf);
       return(0);
}
Check Commonly Used Metrics
Listing 3‑10 lists the commonly used transaction monitoring plug-in routine metrics.
 
Configure the Plug-in to Tuxedo
Note:
Register to Tuxedo
Tuxedo uses the epifreg command to register the plug-ins to the Tuxedo registry so that the infrastructure can invoke the plug-in at run time. Oracle TSAM uses the Oracle TSAM framework to invoke the plug-in.
Listing 3‑13 shows how the epifreg command is used to invoke a plug-in.
Listing 3‑13 Using epifreg to Invoke a Plug-in
epifreg -r -p abc/tuxedo/tsam -i engine/performance/monitoring \
       -o SYSTEM -v 1.0 -f /test/abc/customplugin.so -e plugin_entry
epifregedt -s -k "SYSTEM/impl/bea/performance/monfan" \
       -a InterceptionSeq=bea/performance/monshm \
          -a InterceptionSeq=abc/tuxedo/tsam
 
In this, there are two steps required to register the custom plug-in Tuxedo.
1.
a.
-p” option specifies the implementation id and it must be consistent the value specified in source code.
b.
-v” indicates the version number.
c.
-f” specifies the dynamic library path.
d.
-e” specifies the “entry” routine described in the “General Steps” section.
2.
Using “epifregedt” to change the fan-out plug-in “InterceptionSeq” attribute.
Oracle TSAM supports a Fan-out plug-in mechanism which means multiple plug-ins can work together. Oracle TSAM Agent provides the Fan-out plug-in and a default interceptor plug-in. The custom plug-in is an additional interceptor plug-in.
The “-a InterceptionSeq=xxx” option tells the Fan-out plug-in invokes the interceptor plug-in using the specified order. “xxx” is the implementation id. In this example, the Tuxedo default interceptor plug-in implementation ID, “bea/performance/monshm”, is invoked before the custom plug-in implementation ID “abc/tuxedo/tsam”.
3.
Un-register from Tuxedo
epifunreg” can be used to un-register a specified plug-in, for example,
epifunreg -p abc/tuxedo/tsam
After unregistering the custom plug-in, you must use “epifregedt” to modify the Fan-out plug-in invocation again based on current available plug-ins. For example:
epifregedt -s -k "SYSTEM/impl/bea/performance/monfan" \
-a InterceptionSeq=bea/performance/monshm
Note:
Oracle TSAM Agent Plug-in Development/Deployment Notes
Do not use Oracle Tuxedo ATMI calls in the plug-in except for the FML32 operations tpalloc/tprealloc/tpfree and tptypes. The monitoring points are embedded in the Tuxedo communication framework. Embedded ATMI calls may compromise current Tuxedo context.

Copyright © 1994, 2017, Oracle and/or its affiliates. All rights reserved.