This Blog is discontinued, its only read-only

Monday, November 2, 2020

CVE-2020-14750 - Oracle WebLogic Server

 Today on 2nd November 2020 Oracle released overlay patches for the CVE-2020-14750 (https://www.oracle.com/security-alerts/alert-cve-2020-14750.html).

This CVE-2020-14750 got a score of 9.8 out of 10. According to SANS ISC InfoSec the exploitation of this vulnerability is really trivial, see https://isc.sans.edu/forums/diary/PATCH+NOW+CVE202014882+Weblogic+Actively+Exploited+Against+Honeypots/26734/

Oracle released already overlay patches, which needs to be applied over an already patched Oracle WebLogic Server with the CPU October 2020.

Following Oracle WebLogic released are affected (https://support.oracle.com/epmos/faces/DocContentDisplay?id=2724951.1):

Oracle WebLogic Server 10.3.6

Oracle WebLogic Server 12.1.3

Oracle WebLogic Server 12.2.1.3

Oracle WebLogic Server 12.2.1.4

Oracle WebLogic Server 14.1.1

It's strongly recommended to apply this overlay patch to your Oracle WebLogic Server environments.


Monday, October 26, 2020

Oracle Forms & Reports 12.2.1.4.0 certified with ATP

Since a few days, the current release of Oracle Forms & Reports 12.2.1.4.0 is officially certified with the use of Oracle Autonomous Transaction Processing (ATP) Database.

You can use the ATP Database for the Metadata Repository for Oracle Forms & Reports 12.2.1.4.0 and/or as application Database.

The certification you can see in the What's new Guide https://docs.oracle.com/en/middleware/developer-tools/forms/12.2.1.4/releasenotes-fnr/whats-new-this-release.html#GUID-5D5D50BB-9358-4009-A324-024EF97CA3D8

In the Oracle Fusion Middleware 12c Certification Excel Sheet for 12.2.1.4.0, https://www.oracle.com/technetwork/middleware/fmw-122140-certmatrix-5763476.xlsx you can see the certification for the usage of ATP databases as well:



Friday, September 4, 2020

In-Process Reports Server

From time to time I am receiving questions concerning the Oracle In-Process Reports Server which come by default with the configuration of Oracle Forms & Reports.

Mainly the questions are, how can start or stop the In-Process Reports Server or how to disable the default In-Process Reports Server completely?


Start and Stop of the In-Process Reports Server

To start, simple open a Browser and point to http://<your_server_name>:<Port_of_ManagedServerReports>/reports/rwservlet/startserver

To stop just use http://<your_server_name>:<Port_of_ManagedServerReports>/reports/rwservlet/stopserver


Disable the In-Process Reports Server

In order to completely disable the default In-Process Reports Server, you have to edit the rwservlet.properties file, which is located under $DOMAIN_HOME/config/fmwconfig/servers/<Name_ManagedServerReports>/applications/reports_12.2.1/configuration

#
# Align the line from
<inprocess>yes</inprocess>
# to
<inprocess>no</inprocess>

After that restart the ManagedServer for Reports and you are done.

In Oracle Reports 11.x Releases, you can disable the default In-Process Reports Server via the Enterprise Manager Fusion Middleware Control under the Reports Menu. 

But in Oracle Reports 12.x the management of Reports is no longer available within the Enterprise Manager Fusion Middleware Control, so you will have to do it manually directly in the rwservlet.properties file.


Monday, August 24, 2020

Oracle Forms & Reports 12.2.1.4.0 on Oracle Linux 8 / Redhat 8

Oracle Forms & Reports 12.2.1.4.0 is officially supported and certified with Oracle Linux 8 and Redhat 8. But in case you want to install the Oracle Forms & Reports 12.2.1.4.0 you will see that you are running into an error while performing the prerequirement check.


#
Starting check : CertifiedVersions
Expected result: One of oracle-7, redhat-7, redhat-6, oracle-6, SuSE-11, SuSE-12, SuSE-15
Actual Result: redhat-8.2
Check complete. The overall result of this check is: Passed
CertifiedVersions Check: Success.

Starting check : Packages
Checking for binutils-2.23.52.0.1; found binutils-2.30-73.el8-x86_64.	Passed
Checking for compat-libcap1-1.10; Not found.	Failed
Checking for compat-libstdc++-33-3.2.3-x86_64; Not found.	Failed
Checking for libgcc-4.8.2-x86_64; found libgcc-8.3.1-5.el8-x86_64.	Passed
Checking for libstdc++-4.8.2-x86_64; found libstdc++-8.3.1-5.el8-x86_64.	Passed
Checking for libstdc++-devel-4.8.2-x86_64; found libstdc++-devel-8.3.1-5.el8-x86_64.	Passed
Checking for sysstat-10.1.5; found sysstat-11.7.3-2.el8-x86_64.	Passed
Checking for gcc-4.8.2; found gcc-8.3.1-5.el8-x86_64.	Passed
Checking for gcc-c++-4.8.2; found gcc-c++-8.3.1-5.el8-x86_64.	Passed
Checking for ksh-...; found ksh-20120801-254.el8-x86_64.	Passed
Checking for make-3.82; found make-1:4.2.1-10.el8-x86_64.	Passed
Checking for glibc-2.17-x86_64; found glibc-2.28-101.el8-x86_64.	Passed
Checking for glibc-devel-2.17-x86_64; found glibc-devel-2.28-101.el8-x86_64.	Passed
Checking for libaio-0.3.109-x86_64; found libaio-0.3.112-1.el8-x86_64.	Passed
Checking for libaio-devel-0.3.109-x86_64; found libaio-devel-0.3.112-1.el8-x86_64.	Passed
Checking for motif-2.3.4; found motif-2.3.4-16.el8-x86_64.	Passed
Check complete. The overall result of this check is: Failed

As you can see from above, the Oracle Installer is failing because of the missing packages compat-libcap1-1.10 and compat-libstdc++-33-3.2.3-x86_64.
These 2 packages can not be found in the Oracle Linux 8 and Redhat 8 distrubition, they have been removed since Release 8.

To resolve this problem, you will need to download the Patch 31190532 from My Oracle Support, transfer the patch to your target server, extract the patch somewhere and modify your Oracle Installer startup command as follows:

#
./fmw_12.2.1.4.0_fr_linux64.bin -prereqConfigLoc <Path_to_the_patch>/31190532/prereq_metadata/oracle.as.install.fr.prerequisite/prereq

and now the Oracle Installer will successfully pass the prerequirement checks:

#
Starting check : CertifiedVersions
Expected result: One of oracle-8, oracle-7, redhat-8, redhat-7, redhat-6, oracle-6, SuSE-11, SuSE-12, SuSE-15
Actual Result: redhat-8.2
Check complete. The overall result of this check is: Passed
CertifiedVersions Check: Success.

Starting check : Packages
Checking for binutils-2.23.52.0.1; found binutils-2.30-73.el8-x86_64.	Passed
Checking for libcap-2.25-9; found libcap-2.26-3.el8-x86_64.	Passed
Checking for libstdc++-8.2.1-3.5.0.1.el8-x86_64; found libstdc++-8.3.1-5.el8-x86_64.	Passed
Checking for libgcc-4.8.2-x86_64; found libgcc-8.3.1-5.el8-x86_64.	Passed
Checking for libstdc++-devel-4.8.2-x86_64; found libstdc++-devel-8.3.1-5.el8-x86_64.	Passed
Checking for sysstat-10.1.5; found sysstat-11.7.3-2.el8-x86_64.	Passed
Checking for gcc-4.8.2; found gcc-8.3.1-5.el8-x86_64.	Passed
Checking for gcc-c++-4.8.2; found gcc-c++-8.3.1-5.el8-x86_64.	Passed
Checking for ksh-...; found ksh-20120801-254.el8-x86_64.	Passed
Checking for make-3.82; found make-1:4.2.1-10.el8-x86_64.	Passed
Checking for glibc-2.17-x86_64; found glibc-2.28-101.el8-x86_64.	Passed
Checking for glibc-devel-2.17-x86_64; found glibc-devel-2.28-101.el8-x86_64.	Passed
Checking for libaio-0.3.109-x86_64; found libaio-0.3.112-1.el8-x86_64.	Passed
Checking for libaio-devel-0.3.109-x86_64; found libaio-devel-0.3.112-1.el8-x86_64.	Passed
Checking for motif-2.3.4; found motif-2.3.4-16.el8-x86_64.	Passed
Check complete. The overall result of this check is: Passed
Packages Check: Success.

Monday, May 18, 2020

Oracle WebLogic 14.1.1 under Podman

Since a few weeks the latest release of the Oracle WebLogic Server 14.1.1.0.0 is available and I was testing it already on native Linux Servers and within Docker.
Now it's time to check Oracle WebLogic Server 14.1.1.0.0 under Podman https://podman.io 

At first you will need an Oracle Linux 8.2 Server with podman. A really good instruction you can find at oracle-base.com https://oracle-base.com/articles/linux/podman-install-on-oracle-linux-ol8

As a starting point, just clone my GitHub Repository https://github.com/DirkNachbar/Docker there you will find some Dockerfiles for Oracle WebLogic Server 14.1.1.0.0

The first task is to create a JDK 11 Podman Image.

Under my GitHub Repository in the subdirectory OracleWebLogic/dockerfiles/14.1.1.0.0/serverjre/java-11 you will find a Dockerfile for a JDK 11 Image.
Simply download from Oracle Technology Network https://www.oracle.com/java/technologies/javase-jdk11-downloads.html the Linux Compressed Archive of the JDK 11 and place it in the directory OracleWebLogic/dockerfiles/14.1.1.0.0/serverjre/java-11
Then just run the podman build command as follows:

[root@podman java-11]# 
[root@podman java-11]# cat Dockerfile
#
# Dockerfile for creating Oracle JDK 11 Images based on OL latest
#
FROM oraclelinux:7-slim

MAINTAINER Dirk Nachbar <https://dirknachbar.blogspot.com>

ENV JAVA_PKG=jdk-11*linux-x64_bin.tar.gz \
    JAVA_HOME=/usr/java/default

ADD $JAVA_PKG /usr/java/

RUN export JAVA_DIR=$(ls -1 -d /usr/java/*) && \
    ln -s $JAVA_DIR /usr/java/latest && \
    ln -s $JAVA_DIR /usr/java/default && \
    alternatives --install /usr/bin/java java $JAVA_DIR/bin/java 20000 && \
    alternatives --install /usr/bin/javac javac $JAVA_DIR/bin/javac 20000 && \
    alternatives --install /usr/bin/jar jar $JAVA_DIR/bin/jar 20000

# Execute the podman build command

[root@podman java-11] podman build -t oracle/jdk:11 .
STEP 1: FROM oraclelinux:7-slim
STEP 2: MAINTAINER Dirk Nachbar <https://dirknachbar.blogspot.com>
0a8a2a2490e09457a55c815b8c0e7b84712162282b7dca2290972ae74ab03dcf
STEP 3: ENV JAVA_PKG=jdk-11*linux-x64_bin.tar.gz     JAVA_HOME=/usr/java/default
e308caf489693447f398651473cdbb1b54f77ace324a06831ed518bb0341be3e
STEP 4: ADD $JAVA_PKG /usr/java/
0a2f357d4e064545764064f1ee9e84d6b95dff8e1077d0326a9361bafe58ab41
STEP 5: RUN export JAVA_DIR=$(ls -1 -d /usr/java/*) &&     ln -s $JAVA_DIR /usr/java/latest &&     ln -s $JAVA_DIR /usr/java/default &&     alternatives --install /usr/bin/java java $JAVA_DIR/bin/java 20000 &&     alternatives --install /usr/bin/javac javac $JAVA_DIR/bin/javac 20000 &&     alternatives --install /usr/bin/jar jar $JAVA_DIR/bin/jar 20000
STEP 6: COMMIT oracle/jdk:11
14e68c77ac48b34e8d6ffda5614c03a787c949a920576e1432d8d7fa9697726f

# Check the JDK 11 Image

[root@podman jdk11]# podman images
REPOSITORY                      TAG      IMAGE ID       CREATED          SIZE
localhost/oracle/jdk            11       14e68c77ac48   25 seconds ago   986 MB
docker.io/library/oraclelinux   7-slim   3f15c01b91bb   13 days ago      126 MB

Now as next we can build the Oracle WebLogic Image. For this download the Oracle WebLogic 14c Generic Installer from https://www.oracle.com/middleware/technologies/fusionmiddleware-downloads.html and place the installer (dont unzip it) into the subirectory OracleWebLogic/dockerfiles/14.1.1.0.0
After you have placed the Generic Installer, you can execute the podman build to build the Oracle WebLogic Image as follows

[root@podman 14.1.1.0.0]#
[root@podman 14.1.1.0.0] podman build -t oracle/weblogic:14.1.1.0.0-optimized -f Dockerfile.optimized
STEP 1: FROM oracle/jdk:11 AS base
STEP 2: MAINTAINER Dirk Nachbar <https://dirknachbar.blogspot.com>
a24b9133c927b4ccff67f37c775bf53680e861da472fefd909bc22b775603ca8
STEP 3: ENV ORACLE_HOME=/u01/oracle     USER_MEM_ARGS="-Djava.security.egd=file:/dev/./urandom"     SCRIPT_FILE=/u01/oracle/createAndStartEmptyDomain.sh     PATH=$PATH:${JAVA_HOME}/bin:/u01/oracle/oracle_common/common/bin:/u01/oracle/wlserver/common/bin
239b6e6b88f8f4926dde93e5b10517a695f240c481c5034556066d93d13a59c1
STEP 4: RUN mkdir -p /u01 &&     chmod a+xr /u01 &&     useradd -b /u01 -d /u01/oracle -m -s /bin/bash oracle
49b27820a188efa1c3fb125ba35737819f6c9a5810599ca0f83cf5a39980b13e
STEP 5: COPY container-scripts/createAndStartEmptyDomain.sh container-scripts/create-wls-domain.py /u01/oracle/
9daad5ed3cfd18e0a9e9450374cb6530e18186141da4b7c63d96465981e9c886
STEP 6: ENV DOMAIN_NAME="${DOMAIN_NAME:-base_domain}"     ADMIN_LISTEN_PORT="${ADMIN_LISTEN_PORT:-7001}"     ADMIN_NAME="${ADMIN_NAME:-AdminServer}"     ADMINISTRATION_PORT_ENABLED="${ADMINISTRATION_PORT_ENABLED:-true}"     ADMINISTRATION_PORT="${ADMINISTRATION_PORT:-9002}"
4a0f6a9cda24712750ab4897e3c3c423b3c90880053668d6fb097c5373ad54fa
STEP 7: ENV FMW_PKG=fmw_14.1.1.0.0_wls_Disk1_1of1.zip     FMW_JAR=fmw_14.1.1.0.0_wls.jar
1cf02aa4288004bf699f95255d76c9dbefe2c197c449ef530374afdde4883b9b
STEP 8: FROM 1cf02aa4288004bf699f95255d76c9dbefe2c197c449ef530374afdde4883b9b AS builder
STEP 9: COPY $FMW_PKG install.file oraInst.loc /u01/
4cb0de51b444f880fe3ec0605147bda1ec5a86b46d3ca0bae8e4a4a9e5358b67
STEP 10: RUN  chown oracle:oracle -R /u01 &&      chmod +xr $SCRIPT_FILE
7556f584bf843d9b6741a247d6dc66113ecec2ee6207f8e21a93dc25ca7f952e
STEP 11: USER oracle
cc27e8664abbc4c7ee210588ccac3b2e1b8c8b41129bf88de67914cae68b7ea3
STEP 12: RUN cd /u01 && ${JAVA_HOME}/bin/jar xf /u01/$FMW_PKG && cd - &&     ls /u01 &&     ${JAVA_HOME}/bin/java -jar /u01/$FMW_JAR -silent -responseFile /u01/install.file -invPtrLoc /u01/oraInst.loc -jreLoc $JAVA_HOME -ignoreSysPrereqs -force -novalidation ORACLE_HOME=$ORACLE_HOME INSTALL_TYPE="WebLogic Server" &&     rm /u01/$FMW_JAR /u01/$FMW_PKG /u01/oraInst.loc /u01/install.file
/
fmw_14.1.1.0.0_wls.jar     install.file  oracle
fmw_14.1.1.0.0_wls_Disk1_1of1.zip  oraInst.loc
Launcher log file is /tmp/OraInstall2020-05-18_09-19-42AM/launcher2020-05-18_09-19-42AM.log.
Extracting the installer . . . . . . . Done
Checking if CPU speed is above 300 MHz.   Actual 2194.918 MHz    Passed
Checking swap space: must be greater than 512 MB.   Actual 4067 MB    Passed
Checking temp space: must be greater than 300 MB.   Actual 23718 MB    Passed
Preparing to launch the Oracle Universal Installer from /tmp/OraInstall2020-05-18_09-19-42AM
Log: /tmp/OraInstall2020-05-18_09-19-42AM/install2020-05-18_09-19-42AM.log
Setting ORACLE_HOME...
Setting INSTALL_TYPE...
Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
Reading response file..
Skipping Software Updates
Validations are disabled for this session.
Verifying data
Copying Files
Percent Complete : 10
Percent Complete : 20
Percent Complete : 30
Percent Complete : 40
Percent Complete : 50
Percent Complete : 60
Percent Complete : 70
Percent Complete : 80
Percent Complete : 90
Percent Complete : 100

The installation of Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherence 14.1.1.0.0 completed successfully.
Logs successfully copied to /u01/oracle/.inventory/logs.
5975a5d295923d0d13875bbb180de5acde5e7cb93cf51f8ebe03fea72fe362c8
STEP 13: FROM 1cf02aa4288004bf699f95255d76c9dbefe2c197c449ef530374afdde4883b9b
STEP 14: COPY --chown=oracle:oracle --from=builder $ORACLE_HOME $ORACLE_HOME
bc0e5e9a75ae49cf0800317c5e2da309ae76b036a76ba9528a783f4c06ad5ba6
STEP 15: COPY --chown=oracle:oracle --from=builder $JAVA_HOME $JAVA_HOME
133eb7a4a072b4e2d3d4a50f606f7908fb4adcdd6a7b9479748a9afdc7f8518f
STEP 16: WORKDIR ${ORACLE_HOME}
bfba2b46902c13dd3b4d6fa5e0cdb3a157202140e20c67c931694eced8c82525
STEP 17: CMD ["/u01/oracle/createAndStartEmptyDomain.sh"]
STEP 18: COMMIT oracle/weblogic:14.1.1.0.0-optimized
fba87010a1c6b16a7760af38681f37496163885badb4bd0f0e2515f6fd27edf8

# Now let's verify the podman Image for the WebLogic 14.1.1.0.0 

[root@podman 14.1.1.0.0] podman images
REPOSITORY                      TAG                    IMAGE ID       CREATED       SIZE
localhost/oracle/weblogic       14.1.1.0.0-optimized   fba87010a1c6   2 hours ago   3.11 GB
localhost/oracle/jdk            11                     14e68c77ac48   3 hours ago   986 MB
docker.io/library/oraclelinux   7-slim                 3f15c01b91bb   13 days ago   126 MB

The final step is to create a pod and a running container with Oracle WebLogic Server 14.1.1.0.0.
The pod creation and the container creation can be done within one single command:

[root@podman 14.1.1.0.0]#
[root@podman 14.1.1.0.0] podman run -d --name [Name of your Container] --pod=new:[Pod Name] \
             -p 7001:7001 -p 9002:9002 \
             -v [Directory to your domain.properties file]:/u01/oracle/properties \
             -e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=[WebLogic Domain Name] \
             oracle/weblogic:14.1.1.0.0-optimized
# E.g.:
[root@podman 14.1.1.0.0] podman run -d --name wls1411optimized --pod=new:pod_wls1411 \
             -p 7001:7001 -p 9002:9002 \
             -v /work/Docker/OracleWebLogic/dockerfiles/14.1.1.0.0/properties:/u01/oracle/properties \
             -e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=OptimizedDomain \
             oracle/weblogic:14.1.1.0.0-optimized

# Let's check the pod creation:
[root@podman 14.1.1.0.0] podman pod ls
POD ID         NAME          STATUS    CREATED          # OF CONTAINERS   INFRA ID
4e0b599d0083   pod_wls1411   Running   12 seconds ago   2                 68ccf98d911a

# Let's check the WebLogic Container:
[root@podman 14.1.1.0.0] podman ps
CONTAINER ID  IMAGE                                           COMMAND               CREATED         STATUS             PORTS                   NAMES
5a1e9a6fcd3a  localhost/oracle/weblogic:14.1.1.0.0-optimized  /u01/oracle/creat...  42 seconds ago  Up 41 seconds ago  0.0.0.0:7001->7001/tcp  wls1411optimized

As you can see, it's really easy to get Oracle WebLogic Server 14c up and running under Podman.


Friday, April 24, 2020

Oracle Enterprise Manager 13.4 - New Add-On Plug-ins available

Oracle released some new Add-On Plug-ins for the Oracle Enterprise Manager 13.4.x

Following new Add-On Plug-Ins are available:

  • Enterprise Manager for Oracle Database Appliance
  • Enterprise Manager for TimesTen
  • Enterprise Manager for Oracle GoldenGate
  • Enterprise Manager for Oracle Unified Directory
  • Enterprise Manager for Utilities (TUGBU)
  • Enterprise Manager for Peoplesoft

The installation files for the above mentioned Add-On Plug-Ins can be found under: https://www.oracle.com/enterprise-manager/downloads/oem-v134-update-plugins-downloads.html



Thursday, April 2, 2020

Oracle WebLogic Server 14.1.1.0.0 and Oracle WebLogic Monitoring Exporter

As the latest release of Oracle WebLogic Server 14.1.1.0.0 is available (see my blogposts https://dirknachbar.blogspot.com/2020/03/oracle-weblogic-141100-available.html and https://dirknachbar.blogspot.com/2020/03/oracle-weblogic-141100-first-look.html), it's time to test Oracle WebLogic Server 14.1.1.0.0 and the Oracle WebLogic Monitoring Exporter https://github.com/oracle/weblogic-monitoring-exporter

In a previous blogpost (https://dirknachbar.blogspot.com/2020/02/weblogic-monitoring-with-prometheus-and.html) I was already talking about the Oracle WebLogic Monitoring Exporter, which is generating Prometheus conform metrics out of the Oracle WebLogic Server 12.2.x.

In the WebLogic Monitoring Exporter release 1.1.1 was a small issue with the option "domainQualifier: true". This option was causing, that a non Prometheus conform metric was generated and therefor your Prometheus Server couldn't capture the metrics.
With the actual release 1.1.2 of the WebLogic Monitoring Exporter this issue is fixed, many thanks to the Development Team behind the WebLogic Monitoring Exporter.

So, what you will need, is a running WebLogic Server 14.1.1.0.0 domain, download the get1.1.2.sh file from https://github.com/oracle/weblogic-monitoring-exporter/releases and create a YAML file for the to be generated metrics:

#
$ cat exporter-config.yml

metricsNameSnakeCase: true
domainQualifier: true
queries:
- key: name
  keyName: location
  prefix: wls_server_
  applicationRuntimes:
    key: name
    keyName: app
    componentRuntimes:
      prefix: wls_webapp_config_
      type: WebAppComponentRuntime
      key: name
      values: [deploymentState, contextRoot, sourceInfo, sessionsOpenedTotalCount, openSessionsCurrentCount, openSessionsHighCount]
      servlets:
        prefix: wls_servlet_
        key: servletName
- JVMRuntime:
    prefix: wls_jvm_
    key: name
- executeQueueRuntimes:
    prefix: wls_socketmuxer_
    key: name
    values: [pendingRequestCurrentCount]
- workManagerRuntimes:
    prefix: wls_workmanager_
    key: name
    values: [stuckThreadCount, pendingRequests, completedRequests]
- threadPoolRuntime:
    prefix: wls_threadpool_
    key: name
    values: [executeThreadTotalCount, queueLength, stuckThreadCount, hoggingThreadCount]
- JMSRuntime:
    key: name
    keyName: jmsruntime
    prefix: wls_jmsruntime_
    JMSServers:
      prefix: wls_jms_
      key: name
      keyName: jmsserver
      destinations:
        prefix: wls_jms_dest_
        key: name
        keyName: destination
 
- persistentStoreRuntimes:
    prefix: wls_persistentstore_
    key: name
- JDBCServiceRuntime:
    JDBCDataSourceRuntimeMBeans:
      prefix: wls_datasource_
      key: name
- JTARuntime:
    prefix: wls_jta_
    key: name

Place the get1.1.2.sh and the YAML file in one directory and execute from your Shell following command, which will add your YAML file into the wls-exporter.war file.

#
$ ls -la
-rw-r--r--    1 oracle  oinstall     1401 Apr  2 11:46 exporter-config.yml
-rwxr-xr-x@   1 oracle  oinstall      373 Apr  2 11:43 get1.1.2.sh

$ ./get1.1.2.sh exporter-config.yml 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   607  100   607    0     0   1568      0 --:--:-- --:--:-- --:--:--  1564
100 2018k  100 2018k    0     0   937k      0  0:00:02  0:00:02 --:--:-- 2009k
created /var/folders/b_/ldw8b91n7h7dp58hd3xf2qmc0000gn/T/ci-XXXXXXXXXX.EUmQ8eka
/var/folders/b_/ldw8b91n7h7dp58hd3xf2qmc0000gn/T/ci-XXXXXXXXXX.EUmQ8eka ~/Downloads/test
in temp dir
updating: config.yml
 zip warning: Local Entry CRC does not match CD: config.yml
 (deflated 64%)
~/Downloads/test

$ ls -la wls-exporter.war
-rw-r--r--    1 oracle  oinstall  2066869 Apr  2 11:47 wls-exporter.war

Now, just deploy the newly generated war file wls-exporter.war on your WebLogic 14.1.1.0.0 domain, start the webapp and you can access the metrics over the URL http://<Your Servername>:<Port of Managed Server or AdminServer>/wls-exporter/metrics

Snippet from an AdminServer
Snippet from a Managed Server

How to integrate the metrics from your WebLogic Server 14.1.1.0.0 into your Prometheus, just have a look on my previous blogpost "Weblogic Monitoring with Prometheus and Grafana" https://dirknachbar.blogspot.com/2020/02/weblogic-monitoring-with-prometheus-and.html. The method remains the same as for Oracle WebLogic Server 12.2.x


Wednesday, April 1, 2020

Oracle WebLogic Server 14.1.1.0.0 Docker Image

As since around 2 days the latest Oracle WebLogic Server 14.1.1.0.0 was released, I had some time to create Docker Images for the Oracle WebLogic Server 14.1.1.0.0

I have created two versions based on WebLogic Server 14.1.1.0.0 Generic with JDK 11:
  • General Docker Image (not optimized with space usage)
  • Optimized Docker Image (nearly 50% space savings)
The corresponding Dockerfiles and so on you can find in my GitHub Repository https://github.com/DirkNachbar/Docker/tree/master/OracleWebLogic
The Readme for the usage is under https://github.com/DirkNachbar/Docker/blob/master/OracleWebLogic/README1411.md

So just clone the above mentioned GitHub Repository, get the 2 required installation files:
Drop the WebLogic 14.1.1.0.0 Generic installer into the directory Docker/OracleWebLogic/dockerfiles/14.1.1.0.0
Drop the JDK 11.0.6 installer into the directory Docker/OracleWebLogic/dockerfiles/14.1.1.0.0/serverjre/java-11

At first you need to run the script Docker/OracleWebLogic/dockerfiles/14.1.1.0.0/serverjre/java-11/buildDockerImage.sh
After that you should have a Docker Image for your JDK 11.

#
docker images | grep jdk
REPOSITORY          TAG                    IMAGE ID            CREATED             SIZE
oracle/jdk          11                     19088de5fc56        23 minutes ago      422MB

As next you have to run the script Docker/OracleWebLogic/dockerfiles/buildDockerImage.sh

#
$ ./buildDockerImage.sh -v 14.1.1.0.0 -o
Checking if required packages are present and valid...
fmw_14.1.1.0.0_wls_Disk1_1of1.zip: OK
=====================
Building image 'oracle/weblogic:14.1.1.0.0-optimized' ...
Sending build context to Docker daemon  1.111GB
Step 1/17 : FROM oracle/jdk:11 as base
. . .
. . .
Successfully built ebe06a93a85b
Successfully tagged oracle/weblogic:14.1.1.0.0-optimized

  WebLogic Docker Image for 'optimized' version 14.1.1.0.0 is ready to be extended:

    --> oracle/weblogic:14.1.1.0.0-optimized

  Build completed in 76 seconds.

$ docker images | grep weblogic
REPOSITORY          TAG                    IMAGE ID            CREATED             SIZE
oracle/weblogic     14.1.1.0.0-optimized   ebe06a93a85b        5 minutes ago       1.62GB

In order to get a running WebLogic 14.1.1.0.0 Container you just need to align at first the domain.properties under Docker/OracleWebLogic/dockerfiles/14.1.1.0.0/properties with your preferred WebLogic username and password and execute your docker run command

#
# Define the Docker Image based on your above Docker Image build
# Either its "oracle/weblogic:14.1.1.0.0-optimized" or "oracle/weblogic:14.1.1.0.0-generic"

$ docker run -d --name <ContainerName> \
             -p 7001:7001 -p 9002:9002 \
             -v <Host Path to subdirectory properties>:/u01/oracle/properties \
             -e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=<DomainName> \
             oracle/weblogic:14.1.1.0.0-optimized

$ docker logs -f <ContainerName>

# For Example:

$ docker run -d --name wls1411optimized \
             -p 7001:7001 -p 9002:9002 \
             -v /projects/Docker/OracleWebLogic/dockerfiles/14.1.1.0.0/properties:/u01/oracle/properties \
             -e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=OptimizedDomain \
             oracle/weblogic:14.1.1.0.0-optimized

$ docker logs -f wls1411optimized

. . .
. . .
<Apr 1, 2020, 12:40:28,980 PM Greenwich Mean Time> <Notice> <WebLogicServer> <BEA-000329> <Started the WebLogic Server Administration Server "AdminServer" for domain "OptimizedDomain" running in production mode.> 
<Apr 1, 2020, 12:40:28,980 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "DefaultSecure" is now listening on 172.17.0.2:7002 for protocols iiops, t3s, ldaps, https.> 
<Apr 1, 2020, 12:40:28,981 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "Default" is now listening on 172.17.0.2:7001 for protocols iiop, t3, ldap, snmp, http.> 
<Apr 1, 2020, 12:40:28,981 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "Default[1]" is now listening on 127.0.0.1:7001 for protocols iiop, t3, ldap, snmp, http.> 
<Apr 1, 2020, 12:40:28,982 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "DefaultSecure[1]" is now listening on 127.0.0.1:7002 for protocols iiops, t3s, ldaps, https.> 
<Apr 1, 2020, 12:40:28,983 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "DefaultSecure" is now listening on 172.17.0.2:7002 for protocols iiops, t3s, ldaps, https.> 
<Apr 1, 2020, 12:40:28,983 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "Default" is now listening on 172.17.0.2:7001 for protocols iiop, t3, ldap, snmp, http.> 
<Apr 1, 2020, 12:40:28,984 PM Greenwich Mean Time> <Notice> <Server> <BEA-002613> <Channel "Default[1]" is now listening on 127.0.0.1:7001 for protocols iiop, t3, ldap, snmp, http.> 
<Apr 1, 2020, 12:40:29,010 PM Greenwich Mean Time> <Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.> 
<Apr 1, 2020, 12:40:29,021 PM Greenwich Mean Time> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.> 


Tuesday, March 31, 2020

Oracle WebLogic 14.1.1.0.0 - First Look

Since last night the Oracle WebLogic Server 14.1.1.0.0 is available for download (see my previous blog post https://dirknachbar.blogspot.com/2020/03/oracle-weblogic-141100-available.html).

Now let's have a look on the new Oracle WebLogic Server 14.1.1.0.0

At first we can use now a JDK 11 with the WebLogic Server 14.1.1.0.0, for the following showcase I am using a JDK 11.0.6.

At first download the required software installation files:


Then transfer the above files to your target server. For the JDK installation, my personal preferences are, that I install the JDK under the oracle software user, so that I am independent from the Java delivered and maintained by the Linux distribution. For example:

# Align the target directory
# for the JDK 11 to your settings
mv /tmp/jdk-11.0.6_linux-x64_bin.tar.gz /u00/app/oracle/product
gunzip jdk-11.0.6_linux-x64_bin.tar.gz
tar -xvf jdk-11.0.6_linux-x64_bin.tar
export JAVA_HOME=/u00/app/oracle/product/jdk-11.0.6
export PATH=$JAVA_HOME/bin:$PATH

As next unzip the WebLogic Server 14.1.1.0.0 Generic Installer zip file.

cd /tmp
unzip fmw_14.1.1.0.0_wls_Disk1_1of1.zip
java -jar fmw_14.1.1.0.0_wls.jar 
Launcher log file is /tmp/OraInstall2020-03-31_11-35-42AM/launcher2020-03-31_11-35-42AM.log.
Extracting the installer . . . . . . Done
Checking if CPU speed is above 300 MHz.   Actual 2194.918 MHz    Passed
Checking monitor: must be configured to display at least 256 colors.   Actual 16777216    Passed
Checking swap space: must be greater than 512 MB.   Actual 3071 MB    Passed
Checking temp space: must be greater than 300 MB.   Actual 10290 MB    Passed
Preparing to launch the Oracle Universal Installer from /tmp/OraInstall2020-03-31_11-35-42AM

At first set your Oracle Inventory and align the operating system group

Then confirm the Welcome screen with the button Next

Select Skip Auto Updates and proceed with the Next button

Set the target ORACLE_HOME to your environment

Choose the Installation Type, either WebLogic or Coherence or Complete with Examples

The Prerequisite Checks are executed, be sure that they successfully completed

Confirm the Installation Summary with the Next button

The installation is starting now

When the Installation Progress is reaching 100% you can proceed with the Next button.

Under the Installation Complete screen you can find a summing up of the installation.

As next go to the $MW_HOME/oracle_common/common/bin directory and start the Configuration Wizard to create a WebLogic 14.1.1.0.0 Domain.

#
cd $MW_HOME/oracle_common/common/bin
./config.sh

The Configuration Wizard is the same as in the previous releases of Oracle WebLogic Server, so just get through the various settings and configure and create your WebLogic Domain, then startup your NodeManager ($DOMAIN_HOME/bin/startNodeManager.sh) and the WebLogic Server AdminServer ($DOMAIN_HOME/startWebLogic.sh).

Now you can connect to the WebLogic Console http://<Your ServerName>:<AdminServerPort>/console and login with your weblogic user and password


As you can see under the Domain Structure Navigation, that under the entry Environment the element Partition is gone. From WebLogic 14.1.1.0.0 the Multitenant (Partitions) option is removed




Oracle WebLogic 14.1.1.0.0 available

Since last night the latest release of the Oracle WebLogic Server 14.1.1.0.0 is available for download.

There are 3 different installation types available for download:

  • Generic Installer (888 MB)
  • Quick Installer (514 MB)
  • Slim Installer (474 MB)

The software download files can be found under: https://www.oracle.com/middleware/technologies/fusionmiddleware-downloads.html



The overall Oracle WebLogic Server 14.1.1.0.0 documentation can be found under https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/index.html



The "What's new in WebLogic Server" guide can be found under: https://www.oracle.com/pls/topic/lookup?ctx=en/middleware/standalone/weblogic-server/14.1.1.0&id=NOTES107

Now with the latest Oracle WebLogic 14.1.1.0.0 you will have the official certification for Java 11. A complete overview of the Oracle WebLogic 14.1.1.0.0 Certification you can find in the Excel Sheet https://www.oracle.com/technetwork/middleware/fmw-141100-certmatrix-6400512.xlsx


Monday, March 30, 2020

Oracle Fusion Middleware 12.2.1.4.0 certified with Linux 8

Currently Oracle certified the Oracle Fusion Middleware 12.2.1.4.0 Components for the use of Linux 8, which includes the Oracle Linux 8 and the Red Hat Enterprise Linux 8.

You can find the newly added certifications in My Oracle Support (https://support.oracle.com) under the tab Certifications:

Oracle WebLogic 12.2.1.4.0 Certification:



Oracle Forms & Reports 12.2.1.4.0 Certification:



Oracle SOA Suite 12.2.1.4.0 Certification:



Moreover you can find the corresponding Oracle Fusion Middleware 12c Certifications under https://www.oracle.com/middleware/technologies/fusion-certification.html and there the Excel Sheet https://www.oracle.com/technetwork/middleware/fmw-122140-certmatrix-5763476.xlsx which contains the newly added certification for Linux 8 (Oracle Linux 8 and Red Hat Enterprise Linux 8).

Under the "Oracle Fusion Middleware System Requirements and Specifications" documentation for 12.2.1.4.0 in the section "Linux Operating System Requirements" (https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.4/sysrs/system-requirements-and-specifications.html#GUID-37C51062-3732-4A4B-8E0E-003D9DFC8C26) you can find all required packages to be installed.
Take note that 2 of them are EL7 packages (compat-libcap1-1.10-7.el7.x86_64 and compat-libstdc++-33-3.2.3-72.el7.x86_64), which are not longer present in the Linux 8 distributions, so when you install your Fusion Middleware 12.2.1.4.0 components just ignore the warnings/failure for the 2 EL7 packages by using the Skip button in the graphical installer.


Monday, March 2, 2020

Generating Prometheus Metrics directly from your Oracle Database

Prometheus (https://prometheus.io/) is getting more and more common as a Monitoring Solution, many products are offering out-of-box Prometheus formatted metrics (e.g WildFly, Spring Boot and so on). Even Oracle is providing for the Oracle WebLogic Server a weblogic-monitoring-exporter, which is generating Prometheus formatted metrics (see https://github.com/oracle/weblogic-monitoring-exporter and checkout my previous blog post "WebLogic Monitoring with Prometheus and Grafana" https://dirknachbar.blogspot.com/2020/02/weblogic-monitoring-with-prometheus-and.html).

Many people are using Oracle Enterprise Manager for Oracle Database Monitoring, which makes sense if you have a certain environment size, but for some small environments, e.g. you have a couple of database, Oracle Enterprise Manager might be an overkill. On top, if you are running your Oracle Database in Docker, you might want to have an agent-less and lightweight monitoring alternative.

So why not to use Prometheus? The problem is, Oracle is not providing Prometheus formatted metrics for the Oracle Database :-( but with a little bit of PL/SQL and Oracle REST Data Services (ORDS) you can get Prometheus formatted metrics out of your Oracle Database and you can define which metrics you want to get.

The first step is to create a procedure which will collect your Prometheus formatted metrics, for this I am simply using the good old PL/SQL Webtool Kit. In my case I will create the procedure under the Oracle Database User dbsnmp, as this user got already the required permissions on the various v$ and dba_% views.

The basic concept is really simply, at first define all the cursors you will need for collecting your required metrics, e.g. "c_process is SELECT COUNT(*) as count FROM v$process;" and later you will loop over the cursor and generate a output with htp.print. That's all ...

Below is an example, which you can use as starting point to collect your metrics and you can easily add your own required metrics or remove them.

create or replace NONEDITIONABLE procedure prometheus_metrics IS
-- =======================================================================
-- Procedure prometheus_metrics
-- Purpose: Generating Prometheus formatted metrics from the Oracle DB
--
-- Author: Dirk Nachbar, https://dirknachbar.blogspot.com
--
-- =======================================================================
--
   cursor c_processes is
          SELECT COUNT(*) as count FROM v$process;
   --
   cursor c_sessions is
          SELECT status, type, COUNT(*) as value FROM v$session GROUP BY status, type;
   --
   cursor c_activities is
          SELECT name, value FROM v$sysstat WHERE name IN ('parse count (total)', 'execute count', 'user commits', 'user rollbacks');
   --
   cursor c_version is
          select 'Oracle' as oracle, substr(version_full, 1,2)||'.'|| substr(version_full, 4,1) as value from v$instance;
   --
   cursor c_tablespaces is
            SELECT
    Z.name       as tablespace,
    dt.contents  as type,
    Z.bytes      as bytes,
    Z.max_bytes  as max_bytes,
    Z.free_bytes as free
  FROM
  (
    SELECT
      X.name                   as name,
      SUM(nvl(X.free_bytes,0)) as free_bytes,
      SUM(X.bytes)             as bytes,
      SUM(X.max_bytes)         as max_bytes
    FROM
      (
        SELECT
          ddf.tablespace_name as name,
          ddf.status as status,
          ddf.bytes as bytes,
          sum(coalesce(dfs.bytes, 0)) as free_bytes,
          CASE
            WHEN ddf.maxbytes = 0 THEN ddf.bytes
            ELSE ddf.maxbytes
          END as max_bytes
        FROM
          sys.dba_data_files ddf,
          sys.dba_tablespaces dt,
          sys.dba_free_space dfs
        WHERE ddf.tablespace_name = dt.tablespace_name
        AND ddf.file_id = dfs.file_id(+)
        GROUP BY
          ddf.tablespace_name,
          ddf.file_name,
          ddf.status,
          ddf.bytes,
          ddf.maxbytes
      ) X
    GROUP BY X.name
    UNION ALL
    SELECT
      Y.name                   as name,
      MAX(nvl(Y.free_bytes,0)) as free_bytes,
      SUM(Y.bytes)             as bytes,
      SUM(Y.max_bytes)         as max_bytes
    FROM
      (
        SELECT
          dtf.tablespace_name as name,
          dtf.status as status,
          dtf.bytes as bytes,
          (
            SELECT
              ((f.total_blocks - s.tot_used_blocks)*vp.value)
            FROM
              (SELECT tablespace_name, sum(used_blocks) tot_used_blocks FROM gv$sort_segment WHERE  tablespace_name!='DUMMY' GROUP BY tablespace_name) s,
              (SELECT tablespace_name, sum(blocks) total_blocks FROM dba_temp_files where tablespace_name !='DUMMY' GROUP BY tablespace_name) f,
              (SELECT value FROM v$parameter WHERE name = 'db_block_size') vp
            WHERE f.tablespace_name=s.tablespace_name AND f.tablespace_name = dtf.tablespace_name
          ) as free_bytes,
          CASE
            WHEN dtf.maxbytes = 0 THEN dtf.bytes
            ELSE dtf.maxbytes
          END as max_bytes
        FROM
          sys.dba_temp_files dtf
      ) Y
    GROUP BY Y.name
  ) Z, sys.dba_tablespaces dt
  WHERE
    Z.name = dt.tablespace_name;
    --   
    cursor c_locked_accounts is
           select username, case when account_status like '%LOCKED%' then '1' else '0' END value from dba_users where username in ('SYSTEM', 'SYS', 'DEMO');
    --
    cursor c_top_sessions is
           SELECT a.username as username, a.sid, a.machine as machine, a.program as program, Trunc(b.value/1024) as memorykb
           FROM   v$session a,
                  v$sesstat b,
                  v$statname c
           WHERE  a.sid = b.sid
           AND    a.username is not null
           AND    b.statistic# = c.statistic#
           AND    c.name = 'session pga memory'
           AND    a.program IS NOT NULL
           AND    rownum <= 10
           ORDER BY b.value DESC;
     --
     cursor c_fileio is
            SELECT ddf.tablespace_name as tablespace_name, d.name as filename, f.phyblkrd as blocksread, f.phyblkwrt as blockswriten, f.phyblkrd + f.phyblkwrt as totalio FROM v$filestat f, v$datafile d, dba_data_files ddf WHERE  d.file# = f.file# and ddf.file_id = d.file# ORDER BY f.phyblkrd + f.phyblkwrt DESC;
     --
     cursor c_sga_info is
            SELECT decode(name, 'Fixed SGA Size','FixedSGASize','Redo Buffers','RedoBuffers','Buffer Cache Size','BufferCacheSize','In-Memory Area Size','InMemoryAreaSize','Shared Pool Size','SharedPoolSize','Large Pool Size','LargePoolSize','Java Pool Size','JavaPoolSize','Streams Pool Size','StreamsPoolSize','Shared IO Pool Size','SharedIOPoolSize','Data Transfer Cache Size','DataTransferCacheSize','Granule Size','GranuleSize','Maximum SGA Size','MaximumSGASize','Startup overhead in Shared Pool','StartupOverheadInSharedPool','Free SGA Memory Available','FreeSGAMemoryAvailable') name,
                   bytes as value 
            FROM v$sgainfo;
     --
     cursor c_db_status is
            SELECT instance_name as name, decode(status, 'STARTED', 0, 'MOUNTED', 1, 'OPEN', 2, 'OPEMN MIGRATE', 3) as value
            FROM v$instance;
     --
     cursor c_archiver_status is
            SELECT instance_name as name, decode(archiver, 'STOPPED', 0, 'STARTED', 1, 'FAILED', 2) as value
            FROM v$instance;

--
begin
owa.num_cgi_vars := 0;
htp.init();
--
-- Oracle Version
--
    htp.print('# HELP oracle_version Oracle DB Version Number');
    htp.print('# TYPE oracle_version counter');
    for rec_version in c_version loop
        htp.print('oracle_version ' || rec_version.value);
    end loop;

--
-- Oracle Processes
--
    htp.print('# HELP oracle_processes Current Number of processes');
    htp.print('# TYPE oracle_processes counter');
    for rec_processes in c_processes loop
        htp.print('oracle_processes ' || rec_processes.count);
    end loop;
--
-- Oracle Sessions
--
    htp.print('# HELP oracle_sessions Current Number of sessions');
    htp.print('# TYPE oracle_sessions counter');
    for rec_sessions in c_sessions loop
        htp.print('oracle_sessions{status="'||rec_sessions.status||'",type="'||rec_sessions.type||'"} ' || rec_sessions.value);
    end loop;
--
-- Oracle Activities
--
    htp.print('# HELP oracle_activity Metrics from v$sysstat');
    htp.print('# TYPE oracle_activity counter');
    for rec_activities in c_activities loop
        htp.print('oracle_activities{name="'||rec_activities.name||'"} ' || rec_activities.value);
    end loop;
--
-- Oracle Tablespaces
--
    -- bytes
    htp.print('# HELP oracle_tablespace_bytes Generic counter metric of tablespace bytes in Oracle DB');
    htp.print('# TYPE oracle_tablespace_bytes gauge');
    for rec_tablespaces in c_tablespaces loop
        htp.print('oracle_tablespace_bytes{tablespace="'||rec_tablespaces.tablespace||'",type="'||rec_tablespaces.type||'"} ' || rec_tablespaces.bytes);
    end loop;
    -- free bytes
    htp.print('# HELP oracle_tablespace_free Generic counter metric of tablespace free bytes in Oracle DB');
    htp.print('# TYPE oracle_tablespace_free gauge');
    for rec_tablespaces in c_tablespaces loop
        htp.print('oracle_tablespace_bytes_free{tablespace="'||rec_tablespaces.tablespace||'",type="'||rec_tablespaces.type||'"} ' || rec_tablespaces.free);
    end loop;
    -- max bytes
    htp.print('# HELP oracle_tablespace_max_bytes Generic counter metric of tablespace max bytes in Oracle DB');
    htp.print('# TYPE oracle_tablespace_max_bytes gauge');
    for rec_tablespaces in c_tablespaces loop
        htp.print('oracle_tablespace_max_bytes{tablespace="'||rec_tablespaces.tablespace||'",type="'||rec_tablespaces.type||'"} ' || rec_tablespaces.max_bytes);
    end loop;
--
-- Locked Accounts
--
    htp.print('# HELP oracle_locked_accounts Metrics from dba_users');
    htp.print('# TYPE oracle_locked_accounts counter');
    for rec_locked_accounts in c_locked_accounts loop
        htp.print('oracle_locked_accounts{username="'||rec_locked_accounts.username||'"} ' || rec_locked_accounts.value);
    end loop;
--
-- File IO
--
    htp.print('# HELP oracle_fileio Metrics from v$filestat, v$datafile');
    htp.print('# TYPE oracle_fileio counter');
    for rec_fileio in c_fileio loop
        htp.print('oracle_fileio{tablespace_name="'||rec_fileio.tablespace_name||'",filename="'||rec_fileio.filename||'",type="blocksread"} ' || rec_fileio.blocksread);
        htp.print('oracle_fileio{tablespace_name="'||rec_fileio.tablespace_name||'",filename="'||rec_fileio.filename||'",type="blockswriten"} ' || rec_fileio.blockswriten);
        htp.print('oracle_fileio{tablespace_name="'||rec_fileio.tablespace_name||'",filename="'||rec_fileio.filename||'",type="totalio"} ' || rec_fileio.totalio);
    end loop;
--
-- Top Sessions
--
    htp.print('# HELP oracle_top_sessions Metrics from v$session, v$sesstat, v$statname');
    htp.print('# TYPE oracle_top_sessions counter');
    for rec_top_sessions in c_top_sessions loop
        htp.print('oracle_top_sessions{username="'||rec_top_sessions.username||'",sid="'||rec_top_sessions.sid||'",program="'||rec_top_sessions.program||'"} ' || rec_top_sessions.memorykb);
    end loop;
--
-- SGA Info
--
    htp.print('# HELP oracle_sga_info Metrics from v$sgainfo');
    htp.print('# TYPE oracle_sga_info counter');
    for rec_sga_info in c_sga_info loop
        htp.print('oracle_sga_info{name="'||rec_sga_info.name||'"} ' || rec_sga_info.value);
    end loop;
--
-- DB Status
--
   htp.print('# HELP oracle_db_status from v$instance');
   htp.print('# TYPE oracle_db_status counter');
   for rec_db_status in c_db_status loop
       htp.print('oracle_db_status{name="'||rec_db_status.name||'"} ' || rec_db_status.value);
   end loop;
--
-- Archiver Status
--
   htp.print('# HELP oracle_archiver_status from v$instance');
   htp.print('# TYPE oracle_archiver_status counter');
   for rec_archiver_status in c_archiver_status loop
       htp.print('oracle_archiver_status{name="'||rec_archiver_status.name||'"} ' || rec_archiver_status.value);
   end loop;
end;
/
show err

To test, if the metrics are generated correctly enable the OWA Output in your SQL Developer and execute the above created procedures.



As next we have to setup the Oracle REST Data Services (ORDS). I am using as a showcase the ORDS 19.4 release and will do a setup in Standalone Mode, so with the integrated Jetty Server, you can also deploy your ords.war into a Tomcat or an Oracle WebLogic Server.

Download the ORDS 19.4 from Technical Resources from Oracle (former OTN) https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads.html, transfer the zip file to your server and unzip it somewhere on your server, I am using /u00/app/oracle/product/ords-19.4 (so I am a bit OFA aligned).
Then you have to run the install process:

 #
[oracle@prometheus ords-19.4]$ cd /u00/app/oracle/product/ords-19.4
[oracle@prometheus ords-19.4]$ java -jar ords.war install advanced
This Oracle REST Data Services instance has not yet been configured.
Please complete the following prompts


Enter the location to store configuration data: .
Specify the database connection type to use.
# Choose Option 1 for a Basic Connection String
Enter number for [1] Basic  [2] TNS  [3] Custom URL [1]:1
# Provide the Servername of your Database Server Host
Enter the name of the database server [localhost]:prometheus
# Provide the Listener Port or confirm the default value with 1521
Enter the database listen port [1521]:
# If you are using Database Service Names, choose Option 1
Enter 1 to specify the database service name, or 2 to specify the database SID [1]:
# Provide the Database Service Name
Enter the database service name:DB193
# Choose Option 2
Enter 1 if you want to verify/install Oracle REST Data Services schema or 2 to skip this step [1]:2
# Confirm the default Option 1
Enter 1 if you want to use PL/SQL Gateway or 2 to skip this step.
If using Oracle Application Express or migrating from mod_plsql then you must enter 1 [1]:
# Provide the Database User, in my case dbsnmp
Enter the PL/SQL Gateway database user name [APEX_PUBLIC_USER]:dbsnmp
# Provide 2 times the password of the above provided Database User
Enter the database password for dbsnmp:
Confirm password:
# Choose Option 3
Enter a number to select a feature to enable [1] SQL Developer Web [2] REST Enabled SQL [3] None [1]:3
2020-03-02T08:33:12.149Z INFO   reloaded pools: []
# For showcases I am using the Standalone Mode, so choose Option 1
Enter 1 if you wish to start in standalone mode or 2 to exit [1]:
# Choose if you are using http or https, I choose 1 = http
Enter 1 if using HTTP or 2 if using HTTPS [1]:1
# Provide the http Port, in my case 7778
Enter the HTTP port [8080]:7778
2020-03-02 09:33:34.927:INFO::main: Logging initialized @84052ms to org.eclipse.jetty.util.log.StdErrLog
2020-03-02 09:33:34.967:INFO:oeju.TypeUtil:main: JVM Runtime does not support Modules
2020-03-02T08:33:35.017Z INFO   HTTP and HTTP/2 cleartext listening on host: localhost port: 7778
2020-03-02T08:33:35.039Z INFO   Disabling document root because the specified folder does not exist: /u00/app/oracle/product/ords-19.4/ords/standalone/doc_root
2020-03-02 09:33:35.342:INFO:oejs.Server:main: jetty-9.4.24.v20191120; built: 2019-11-22T11:09:44.612Z; git: 8b8c80157294e38f81ef8ea2358a0c49bf5db918; jvm 1.8.0_232-b09
2020-03-02 09:33:35.380:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2020-03-02 09:33:35.380:INFO:oejs.session:main: No SessionScavenger set, using defaults
2020-03-02 09:33:35.381:INFO:oejs.session:main: node0 Scavenging every 660000ms
2020-03-02T08:33:36.218Z INFO   Configuration properties for: |apex||
db.connectionType=basic
db.hostname=prometheus
db.port=1521
db.servicename=DB193
db.password=******
db.username=dbsnmp
resource.templates.enabled=true

2020-03-02T08:33:36.222Z WARNING *** jdbc.MaxLimit in configuration |apex|| is using a value of 10, this setting may not be sized adequately for a production environment ***
2020-03-02T08:33:36.222Z WARNING *** jdbc.InitialLimit in configuration |apex|| is using a value of 3, this setting may not be sized adequately for a production environment ***
2020-03-02T08:33:37.045Z INFO   Oracle REST Data Services initialized
Oracle REST Data Services version : 19.4.0.r3521226
Oracle REST Data Services server info: jetty/9.4.24.v20191120

2020-03-02 09:33:37.524:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@4470f8a6{/ords,null,AVAILABLE}
2020-03-02 09:33:37.535:INFO:oejs.AbstractConnector:main: Started ServerConnector@74eb909f{HTTP/1.1,[http/1.1, h2c]}{0.0.0.0:7778}
2020-03-02 09:33:37.535:INFO:oejs.Server:main: Started @86661ms

# Now hit Control-C to stop the Jetty Server

^C2020-03-02 09:36:07.794:INFO:oejs.AbstractConnector:Thread-1: Stopped ServerConnector@74eb909f{HTTP/1.1,[http/1.1, h2c]}{0.0.0.0:7778}
2020-03-02 09:36:07.795:INFO:oejs.session:Thread-1: node0 Stopped scavenging
2020-03-02 09:36:07.811:INFO:oejsh.ContextHandler:Thread-1: Stopped o.e.j.s.ServletContextHandler@4470f8a6{/ords,null,UNAVAILABLE}

After the Jetty Server is stopped, we can setup the Database Definition for our Prometheus Metrics.

 #
[oracle@prometheus ords-19.4]$ java -jar ords.war setup --database prometheus_metrics
Specify the database connection type to use.
# Choose Option 1 for a Basic Connection String
Enter number for [1] Basic  [2] TNS  [3] Custom URL [1]:1
# Provide the Servername of your Database Server Host
Enter the name of the database server [localhost]:prometheus
# Provide the Listener Port or confirm the default value with 1521
Enter the database listen port [1521]:
# If you are using Database Service Names, choose Option 1
Enter 1 to specify the database service name, or 2 to specify the database SID [1]:
# Provide the Database Service Name
Enter the database service name:DB193
# Choose Option 2
Enter 1 if you want to verify/install Oracle REST Data Services schema or 2 to skip this step [1]:2
# Confirm the default Option 1
Enter 1 if you want to use PL/SQL Gateway or 2 to skip this step.
If using Oracle Application Express or migrating from mod_plsql then you must enter 1 [1]:
# Provide the Database User, in my case dbsnmp
Enter the PL/SQL Gateway database user name [APEX_PUBLIC_USER]:dbsnmp
# Provide 2 times the password of the above provided Database User
Enter the database password for dbsnmp:
Confirm password:
# Choose Option 3
Enter a number to select a feature to enable [1] SQL Developer Web [2] REST Enabled SQL [3] None [1]:3
2020-03-02T08:37:46.632Z INFO   reloaded pools: [|apex||, |prometheus_metrics||]

As next we need to define the mapped URL for the above created Database Definition

 #
[oracle@prometheus ords-19.4]$ java -jar ords.war map-url --type base-path /prometheus_metrics prometheus_metrics
2020-03-02T08:38:32.462Z INFO   Creating new mapping from: [base-path,/prometheus_metrics] to map to: [prometheus_metrics, null, null]

Finally we can startup the ords.war in standalone mode

 #
[oracle@prometheus ords-19.4]$ java -jar ords.war standalone
2020-03-02 09:38:43.552:INFO::main: Logging initialized @1525ms to org.eclipse.jetty.util.log.StdErrLog
2020-03-02 09:38:43.595:INFO:oeju.TypeUtil:main: JVM Runtime does not support Modules
2020-03-02T08:38:43.652Z INFO   HTTP and HTTP/2 cleartext listening on host: localhost port: 7778
2020-03-02T08:38:43.682Z INFO   Disabling document root because the specified folder does not exist: /u00/app/oracle/product/ords-19.4/ords/standalone/doc_root
2020-03-02 09:38:44.283:INFO:oejs.Server:main: jetty-9.4.24.v20191120; built: 2019-11-22T11:09:44.612Z; git: 8b8c80157294e38f81ef8ea2358a0c49bf5db918; jvm 1.8.0_232-b09
2020-03-02 09:38:44.330:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2020-03-02 09:38:44.330:INFO:oejs.session:main: No SessionScavenger set, using defaults
2020-03-02 09:38:44.331:INFO:oejs.session:main: node0 Scavenging every 600000ms
2020-03-02T08:38:45.500Z INFO   Configuration properties for: |apex||
db.connectionType=basic
db.hostname=prometheus
db.port=1521
db.servicename=DB193
db.password=******
db.username=dbsnmp
resource.templates.enabled=true

2020-03-02T08:38:45.507Z WARNING *** jdbc.MaxLimit in configuration |apex|| is using a value of 10, this setting may not be sized adequately for a production environment ***
2020-03-02T08:38:45.507Z WARNING *** jdbc.InitialLimit in configuration |apex|| is using a value of 3, this setting may not be sized adequately for a production environment ***
2020-03-02T08:38:46.221Z INFO   Configuration properties for: |prometheus_metrics||
db.connectionType=basic
db.hostname=prometheus
db.port=1521
db.servicename=DB193
db.password=******
db.username=dbsnmp
resource.templates.enabled=true

2020-03-02T08:38:46.221Z WARNING *** jdbc.MaxLimit in configuration |prometheus_metrics|| is using a value of 10, this setting may not be sized adequately for a production environment ***
2020-03-02T08:38:46.221Z WARNING *** jdbc.InitialLimit in configuration |prometheus_metrics|| is using a value of 3, this setting may not be sized adequately for a production environment ***
2020-03-02T08:38:46.594Z INFO   Oracle REST Data Services initialized
Oracle REST Data Services version : 19.4.0.r3521226
Oracle REST Data Services server info: jetty/9.4.24.v20191120

2020-03-02 09:38:47.093:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@47db50c5{/ords,null,AVAILABLE}
2020-03-02 09:38:47.103:INFO:oejs.AbstractConnector:main: Started ServerConnector@2438dcd{HTTP/1.1,[http/1.1, h2c]}{0.0.0.0:7778}
2020-03-02 09:38:47.103:INFO:oejs.Server:main: Started @5078ms

Just to test, open a browser and point to http://<servername>:<Jetty Port>/ords/prometheus_metrics/PROMETHEUS_METRICS and you show see as follows:


The final step is to add in your Prometheus Configuration File prometheus.yml under the scrape_configs section a job_name for the Prometheus formatted metrics out of your Oracle Database

 
. . .
scrape_configs:
. . .
# Align the IP address and Ports for the targets with your settings
  - job_name: 'oracle_db'
    scrape_interval: 10s
    scrape_timeout: 5s
    metrics_path: /ords/prometheus_metrics/PROMETHEUS_METRICS
    static_configs:
      - targets: ['172.17.0.1:7778']
. . .

Restart your Prometheus Server and check the status of the new target in the Prometheus Console


Under the Graph section in the Prometheus Console you can find your defined metrics from the Oracle Database


Finally you can create in your Grafana a Dashboard to reflect your Oracle Metrics:


As you can see, with a little bit of work, you can collect from your Oracle Database with really easy methods Prometheus formatted metrics, push them into your Prometheus system and build a nice dashboard with Grafana. You can even setup thresholds for your Oracle Database metrics and generate alerts either using the Prometheus Alertmanager or trigger the alerts via Grafana.


Friday, February 28, 2020

Weblogic Monitoring with Prometheus and Grafana

Since quite some time Oracle is providing in their GitHub Repository the weblogic-monitoring-exporter https://github.com/oracle/weblogic-monitoring-exporter.

This weblogic-monitoring-exporter is basically a war file, which uses the WebLogic Server RESTful Management API to collect defined metrics of your WebLogic Server and exports them in a Prometheus compatible format.

At first you will need to download the get[Version-Number].sh from the GitHub Repository https://github.com/oracle/weblogic-monitoring-exporter/releases. Next step is to create a YAML file in which you define which metrics you want to collect from your WebLogic Server.
Place both files in one directory and execute the get[Version-Number].sh with your YAML file as input parameter. The get[Version-Number].sh will simple download from GitHub the required war file, so make sure that your system on which you execute the script got internet connection, and merge your YAML file into the war file.

Example YAML file named exporter-config.yml

metricsNameSnakeCase: true
queries:
- key: name
  keyName: location
  prefix: wls_server_
  applicationRuntimes:
    key: name
    keyName: app
    componentRuntimes:
      prefix: wls_webapp_config_
      type: WebAppComponentRuntime
      key: name
      values: [deploymentState, contextRoot, sourceInfo, sessionsOpenedTotalCount, openSessionsCurrentCount, openSessionsHighCount]
      servlets:
        prefix: wls_servlet_
        key: servletName
- JVMRuntime:
    prefix: wls_jvm_
    key: name
- executeQueueRuntimes:
    prefix: wls_socketmuxer_
    key: name
    values: [pendingRequestCurrentCount]
- workManagerRuntimes:
    prefix: wls_workmanager_
    key: name
    values: [stuckThreadCount, pendingRequests, completedRequests]
- threadPoolRuntime:
    prefix: wls_threadpool_
    key: name
    values: [executeThreadTotalCount, queueLength, stuckThreadCount, hoggingThreadCount]
- JMSRuntime:
    key: name
    keyName: jmsruntime
    prefix: wls_jmsruntime_
    JMSServers:
      prefix: wls_jms_
      key: name
      keyName: jmsserver
      destinations:
        prefix: wls_jms_dest_
        key: name
        keyName: destination

- persistentStoreRuntimes:
    prefix: wls_persistentstore_
    key: name
- JDBCServiceRuntime:
    JDBCDataSourceRuntimeMBeans:
      prefix: wls_datasource_
      key: name
- JTARuntime:
    prefix: wls_jta_
    key: name


Now let's merge the exporter-config.yml into the wls-exporter.war

 #
./get1.1.1.sh exporter-config.yml 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   607  100   607    0     0   2872      0 --:--:-- --:--:-- --:--:--  2876
100 2018k  100 2018k    0     0  1165k      0  0:00:01  0:00:01 --:--:-- 2247k
created /tmp/ci-21tVFvZiR4
/tmp/ci-21tVFvZiR4 /u00/app/oracle/install
in temp dir
  adding: config.yml (deflated 64%)
/u00/app/oracle/install

As next we can deploy the generated wls-exporter.war on your WebLogic Server, just connect with a browser to your WebLogic Console (http://<servername>:<AdminServerPort>/console)

Navigate under the Domain Structure to the Option Deployments, click the "Lock & Edit" button in the Change Center, if you are running your WebLogic Domain in Production Mode and click the "Install" button under the Configuration tab in the Deployments.


Now navigate to the location of the wls-exporter.war file and select it and hit the button "Next"


Make sure that the option "Install this deployment as an application" is marked and hit the button "Next"


Target the deployment of the wls-exporter.war to your Servers and hit the button "Next"


Leave the default and hit the button "Next"


Leave the default and hit the button "Next"


Click the button "Save" and finally click the button "Activate Changes" in the Change Center


After the successful activation you should see as follows


Now we are done with the deployment of the wls-exporter.war and we can start the application, just go to the tab "Control" and click under "Start" the option "Servicing all requests"


Confirm the startup of the application with "Yes"


After that you should see under the Control tab that the wls-exporter application is now in state Active


The next step is to configure your Prometheus environment to collect the metrics from the wls-exporter application. Just add under the scrape_configs section in your prometheus.yml configuration file the necessary entries for the WebLogic Servers.
Simply add under the scrape_config section in the prometheus.yml a job_name for each WebLogic Managed Server (including your AdminServer). If you are adding multiple WebLogic Servers, its advisable to use the metric_relabel_configs option, to prefix each metric collected by Prometheus with for example the name of the WebLogic Server:

 
# Align the job_name with your settings
# Align the IP address and Ports for the targets with your settings
# Align the metric_relabel_configs with your settings

global:
  scrape_interval:     15s
  evaluation_interval: 15s
  scrape_timeout: 10s
. . .
. . .
scrape_configs:
. . .
. . .
  - job_name: 'WebLogicAdminServer'
    scrape_interval: 10s
    metrics_path: /wls-exporter/metrics
    static_configs:
      - targets: ['172.17.0.1:7001']
    basic_auth:
       username: weblogic
       password: Oracle12c
    metric_relabel_configs:
      - source_labels: [__name__]
        target_label: __name__
        replacement: "DemoAdminServer_${1}"

  - job_name: 'WebLogicDEMOMS1'
    scrape_interval: 10s
    metrics_path: /wls-exporter/metrics
    static_configs:
      - targets: ['172.17.0.1:7003']
    basic_auth:
       username: weblogic
       password: Oracle12c
    metric_relabel_configs:
      - source_labels: [__name__]
        target_label: __name__
        replacement: "DEMOMS1_${1}"

  - job_name: 'WebLogicDEMOMS2'
    scrape_interval: 10s
    metrics_path: /wls-exporter/metrics
    static_configs:
      - targets: ['172.17.0.1:7004']
    basic_auth:
       username: weblogic
       password: Oracle12c
    metric_relabel_configs:
      - source_labels: [__name__]
        target_label: __name__
        replacement: "DEMOMS2_${1}"
. . .
. . .

fter this changes, just restart your Prometheus and check under the Prometheus Console - Targets the status of your job_name.


You can see that we have now 3 Endpoints, one for each WebLogic Server (one AdminServer and two Managed Servers).

Under the Prometheus Console - Graph you can see all your defined metrics for your WebLogic Servers.




As next you can create a Dashboard in your Grafana environment.



So with a little bit of work you can easily monitor your WebLogic Environment with Prometheus and Grafana. In addition you can configure thresholds for your metrics and trigger alerts either via the alertmanager from Prometheus or via Grafana.

One point you should take care of with the weblogic-monitoring-exporter is the usage of the configuration option "domainQualifier: true". As documented this configuration is the metrics with the domain name, but currently the option "domainQualifier: true" will cause a non-Prometheus-conform formatted metric.

name{domain="demo_domain"} demo_domain
DemoAdminServer_wls_server_activation_time{domain="demo_domain",location="DemoAdminServer"} 1581419617765
DemoAdminServer_wls_server_admin_server_listen_port{domain="demo_domain",location="DemoAdminServer"} 7001
DemoAdminServer_wls_server_open_sockets_current_count{domain="demo_domain",location="DemoAdminServer"} 4
DemoAdminServer_wls_server_state_val{domain="demo_domain",location="DemoAdminServer"} 2

As you can see from above listing, the wls-exporter is generating the first line wrong, as the metric value is a string and therefor it can not be parsed by Prometheus.

I have currently opened an issue in the GitHub Repository for the weblogic-monitoring-exporter and I hope to get soon a feedback and/or solution https://github.com/oracle/weblogic-monitoring-exporter/issues/82

But nevertheless, the weblogic-monitoring-exporter is a great add-on for the Oracle WebLogic Server in order to monitor your environment with Prometheus and visualise your metrics with Grafana.

UPDATE 2nd April 2020: the above mentioned problem with the non-conform Prometheus formatted metric is resolved by the Oracle Development Team for the WebLogic-Monitoring-Exporter, just get the release 1.1.2 (https://github.com/oracle/weblogic-monitoring-exporter/releases)