03 febrero 2025

 Desarrollo de Scripts en Kotlin para Monitoreo de Oracle 19c y 23ai



Aquí te dejo ejemplos de uso de espacio, sesiones activas y locks, además de una estructura de proyecto en Kotlin para monitoreo de bases de datos Oracle.

Configuración del Proyecto en Kotlin

Si estás desarrollando un proyecto con Kotlin y Oracle, usa Gradle para gestionar las dependencias.

Estructura del Proyecto

/KotlinOracleMonitor

 ├── /src

 │   ├── Main.kt

 │   ├── Database.kt

 │   ├── SpaceMonitor.kt

 │   ├── SessionMonitor.kt

 │   ├── LockMonitor.kt

 ├── build.gradle.kts

 ├── settings.gradle.kts

 └── README.md

Dependencias en build.gradle.kts

plugins {
    kotlin("jvm") version "1.9.0"
    application
}
repositories {
    mavenCentral()
}
dependencies {
    implementation("com.oracle.database.jdbc:ojdbc8:19.8.0.0")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
application {
    mainClass.set("MainKt")
}

Configuración de la Conexión a Oracle

Archivo: Database.kt

import java.sql.Connection
import java.sql.DriverManager
object Database {
    private const val URL = "jdbc:oracle:thin:@//localhost:1521/ORCL"
    private const val USER = "admin"
    private const val PASSWORD = "password"
    fun getConnection(): Connection {
        return DriverManager.getConnection(URL, USER, PASSWORD)
    }
}

Monitoreo del Uso de Espacio

Archivo: SpaceMonitor.kt

fun checkTablespaceUsage() {
    val connection = Database.getConnection()
    val query = """
        SELECT tablespace_name, 
               round((used_space / total_space) * 100, 2) AS used_percentage 
        FROM (
            SELECT tablespace_name,
                   sum(bytes) / 1024 / 1024 AS used_space,
                   (SELECT sum(bytes) / 1024 / 1024 
                    FROM dba_data_files 
                    WHERE tablespace_name = t.tablespace_name) AS total_space
            FROM dba_segments t
            GROUP BY tablespace_name
        )
    """
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(query)
    while (resultSet.next()) {
        println("Tablespace: ${resultSet.getString("tablespace_name")}, Uso: ${resultSet.getDouble("used_percentage")}%")
    }
    connection.close()
}

Monitoreo de Sesiones Activas

Archivo: SessionMonitor.kt

fun checkActiveSessions() {
    val connection = Database.getConnection()
    val query = """
        SELECT sid, serial#, username, status, machine, osuser, program 
        FROM v$session 
        WHERE status = 'ACTIVE'
    """
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(query)
    while (resultSet.next()) {
        println("SID: ${resultSet.getInt("sid")}, User: ${resultSet.getString("username")}, Status: ${resultSet.getString("status")}")
    }
    connection.close()
}

Monitoreo de Locks (Bloqueos en la Base de Datos)

Archivo: LockMonitor.kt

fun checkLocks() {
    val connection = Database.getConnection()
    val query = """
        SELECT l.sid, s.serial#, s.username, l.type, l.lmode, l.request, o.object_name 
        FROM v$lock l
        JOIN v$session s ON l.sid = s.sid
        LEFT JOIN dba_objects o ON l.id1 = o.object_id
        WHERE l.lmode > 0
    """
    val statement = connection.createStatement()
    val resultSet = statement.executeQuery(query)
    while (resultSet.next()) {
        println("SID: ${resultSet.getInt("sid")}, Usuario: ${resultSet.getString("username")}, Objeto: ${resultSet.getString("object_name")}")
    }
    connection.close()
}

Ejecutar Monitoreo

Archivo: Main.kt

fun main() {
    println("Monitoreo de Oracle 19c / 23ai ")
    
    println("\n Uso de Tablespaces:")
    checkTablespaceUsage()
    println("\n Sesiones Activas:")
    checkActiveSessions()
    println("\n Locks en la Base de Datos:")
    checkLocks()
}

Ejecutar el Proyecto

Compilar y ejecutar

./gradlew run

O en Windows:

gradlew.bat run

Salida esperada en consola

Monitoreo de Oracle 19c / 23ai 

Uso de Tablespaces:

Tablespace: USERS, Uso: 65.2%

Tablespace: SYSTEM, Uso: 82.3%

Sesiones Activas:

SID: 123, User: SYSTEM, Status: ACTIVE

Locks en la Base de Datos:

SID: 456, Usuario: HR, Objeto: EMPLOYEES


Conclusión

Con este proyecto, un DBA puede:

 Monitorear el uso de espacio de tablespaces.

  • Ver sesiones activas en la base de datos.
  • Detectar bloqueos (locks) en tiempo real.
  • Automatizar reportes o alertas integrando con Telegram, email o Grafana.


No hay comentarios:

Publicar un comentario

Por favor deja tu comentario, es valioso.