By Hannes Wagener - 2015
This is a Splunk modular input add-on for IBM Websphere MQ. Currently two data inputs are supported. One for creating events from messages on IBM Websphere queues and another for channel status statistics.
Created from the Splunk modular input examples.
NOTE: Python3 is now the default for this modular input. If your environment still uses Python2 you can set the python version in inputs.conf.
Splunk 6.0+, 7+, 8+ (Python2 or Python3 in Splunk V8).
PyMQI 1.5+
ctypes library for Python. NOTE: Splunk V8 has the ctypes libary installed by default for both Python2 and Python3. See the dedicated section in the Troubleshooting section on where you can find or build a compatible _ctypes.so
IBM Websphere MQ Client Libraries V7+
Only currently supported on Linux (but Windows (and any other platform) should be possible if the platform versions of the PyMQI and ctypes libraries are installed)
IMPORTANT: The plugin folder has been renamed from "mq_ta" to "TA-mq". Make sure that you take this into account if you are upgrading the plugin.
ln -s pymqe.cpython-36m-x86_64-linux-gnu.so pymqe.so
Even though the included response handlers works very well, you are encouraged to create your own
response handlers to handle a specific type or format of MQ message. Every site that has IBM MQ will
have custom formats for mesages and which will be written in a variety of different codepages
depending on the platform.
By creating your own response handler you can parse your specific MQ message and index the event in
Splunk so that it's attributes are accessible for searches. Let the included response handlers
serve as examples to your own.
include_payload=false/true
- Include the message payload in the event. Default: trueuse_mqmd_puttime=false/true
- Use the message put time as the event time. Default: true include_mqmd=false/true
- Include the MQMD in the event. Default: false pretty_mqmd=false/true
- Use textual descriptions for MQMD values. Default: truemake_mqmd_printable=false/true
- Escape non text values in the MQMD. Default: true payload_limit=1024
- How many bytes of the payload to include in the splunk event. Default: 1024 (1kb) encode_payload=false/base64/hexbinary
- Encode the payload. Default: false make_payload_printable=false/true
- Escape non text values in the payload. Default: truelog_payload_as_event=false/true
- If false do not log the payload as a name/value pair but rather use the full MQ message as event. Default: truepayload_quote_char='/"
- Use a specific character to quote the "payload" kv value. Default: " (double quote)include_zero_values=true/false
- Include values that are set to zero or default values in the event. Default: falsetextual_values=true/false
- Include the textual description for channel status parameters. Default: trueinclude_complex_top_level = true/false
- Include the complex type top level element when logged.include_bitstream = true/false
- Include the bitstream (base64 or blob) in the splunk event.write_events = true/false
- Write out the events to disk. NOTE: Splunk must have access to the folder to which the events will be written to.gzip_events = true/false
- Gzip the events written to disk.write_events_folder =folder
- Folder to which events must be written to. NOTE: Splunk must have access to the folder to which the events will be written to. Any modular input log errors will get written to $SPLUNK_HOME/var/log/splunk/splunkd.log. Debug logging can be "enabled by changing the "ExecProcessor" property under "Server logging" to DEBUG.
index=_internal component=ExecProcessor TA-mq
ldd pymqe.so
ln -s pymqe.cpython-36m-x86_64-linux-gnu.so pymqe.so
sudo ldconfig
) or add the required environment variables to the "splunk" user's profile(use crtmqenv to generate the required environment). You can use ldd
to show if all shared library dependencies are met. eg. ldd pymqe.so
. The number one problem most people experience with the installation is finding a compatible ctypes library for Splunk's Python2 interpreter(particulary _ctypes.so).
Splunk's Python2 interpreter was built using UCS2 whereas most of the recent builds on Ubuntu, CentOS, RHEL, etc. is built using UCS4 making the two incompatible. Splunk V8 comes with the ctypes library installed for both the Python2 and Python3 interpreters by default making the installation much simpler. But earlier versions of Splunk does not include a ctypes library by default.
The easiest way to see whether a Python interpreter was built using UCS2 or UCS4 is to check the sys.maxunicode
value.
For a UCS2 build the value returned will be 65535. On a UCS4 build the value returned will be 1114111.
For instance - running the python2 interpreter that comes with Splunk:
$ /opt/splunk/bin/python2 Python 2.7.15 (default, Jun 24 2019, 17:39:18) [GCC 5.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print sys.maxunicode 65535 >>>
The 65535 value means that Splunk's Python2 interpreter was built using UCS2.
The quickest way to determine if a _ctypes.so was built using UCS2 or UCS4 is to simply print the enclosed strings and searching for "UCS".
For instance - a _ctypes bullt using UCS4(incompatble with Splunk's Python2) will have the following output:
$ strings _ctypes.so | grep UCS PyUnicodeUCS4_AsWideChar PyUnicodeUCS4_FromEncodedObject PyUnicodeUCS4_FromWideChar PyUnicodeUCS4_AsEncodedString PyUnicodeUCS4_FromUnicode
A version that will be compatible with Splunk's Python2 will have output that looks as follows:
$ strings lib-dynload/_ctypes.so | grep UCS PyUnicodeUCS2_AsWideChar PyUnicodeUCS2_FromEncodedObject PyUnicodeUCS2_FromWideChar PyUnicodeUCS2_AsEncodedString PyUnicodeUCS2_FromUnicode PyUnicodeUCS2_FromWideChar PyUnicodeUCS2_FromUnicode PyUnicodeUCS2_FromEncodedObject PyUnicodeUCS2_AsWideChar PyUnicodeUCS2_AsEncodedString PyUnicodeUCS2_AsWideChar PyUnicodeUCS2_FromEncodedObject PyUnicodeUCS2_FromWideChar PyUnicodeUCS2_AsEncodedString PyUnicodeUCS2_FromUnicode
NOTE: If no strings containing "UCS" was found the library is NOT compatible and almost certainly a Python3 version that cannot be used with Python2.
./configure --enable-unicode=ucs2
You are free to use this code in any way you like, subject to the Python & IBM disclaimers & copyrights. I make no representations about the suitability of this software for any purpose. It is provided "AS-IS" without warranty of any kind, either express or implied.