4
\$\begingroup\$

The idea is to read a file - "data" - and write the information to a new file - "output" - only if it meets the criteria (if the resource usage is more than a configured threshold).

Content of the file "data":

Namespace:              env-demo
Resource                Used            Hard
--------                ----            ----
cpu                     14500m          16
memory                  16857746636800m 32Gi
persistentvolumeclaims  7               9
pods                    12              24
replicationcontrollers  31              36
resourcequotas          1               10
secrets                 12              18
services                17              24


********************
Name:                   2xlarge
Namespace:              env-stg
Resource                Used            Hard
--------                ----            ----
cpu                     12              16
memory                  28306127360     32Gi
persistentvolumeclaims  8               9
pods                    17              24
replicationcontrollers  34              40
resourcequotas          1               10
secrets                 13              18
services                20              24

********************

The program looks like this:

import groovy.transform.Field

//reading the data file
File result = new File("data")
//writes required information to a new file
def output = new File("output")
def line
@Field def Threshold = 0.8

resource_list = [
                      "cpu","memory", "persistentvolumeclaims", "pods", \
                      "replicationcontrollers", "resourcequotas", "secrets", "services"
                ]

//method to process the data and returns only if a resource usage is
//above threshold
def process_data(resource){
    //check if the resource is part of either cpu or memory
    if ( resource[0] in resource_list.take(2)){
       //check if above threshold        
       if ( (resource[2].take(2).toInteger() * Threshold) <= (resource[1].take(2).toInteger())){
           return "${resource[0]} " + "utlization is above threshold with usage of " + "${resource[1]} \n"
       }
    }
    else if ( (resource[2].toInteger() * Threshold) <= (resource[1].toInteger()) ) {
        return "${resource[0]} " + "utlization is above threshold with usage of " + "${resource[1]} \n"
    }
}

result.withReader { reader ->
    while ((line = reader.readLine()) != null) {
        try {
            // find out the project name
            if ("Namespace" == "${line}".split(':')[0]){
                output.append "#################################### \n"
                output.append "${line}".split(':')[1].trim() + "\n"
                output.append "#################################### \n"
            }
            // doing minus do avoid NULL characters
            def resource = "${line}".split('\t').minus('')
            if (resource[0] in resource_list){
                def res = process_data(resource)
                output.append res.minus('null')
            }
        }
        catch (all){
        }

    }
}

The output is:

# cat output 
#################################### 
env-demo
#################################### 
cpu utlization is above threshold with usage of 14500m 
replicationcontrollers utlization is above threshold with usage of 31 
#################################### 
env-stg
#################################### 
memory utlization is above threshold with usage of 28306127360 
persistentvolumeclaims utlization is above threshold with usage of 8 
replicationcontrollers utlization is above threshold with usage of 34 
services utlization is above threshold with usage of 20 

I have written this program by taking the inputs by googling.

Please let me know what improvements should be done in this program.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.