forked from IBM/IBM-Z-zOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Graph_JRE_Data.py
151 lines (136 loc) · 7.27 KB
/
Graph_JRE_Data.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#####################################################################
#
# Predictive Failure Analysis (PFA)
# Graph JES2 Resource Data
#
#This python script is for use with data that is collected, created,
#and written by the PFA_JES2_RESOURCE_EXHAUSTION check only. Its
#use with data from any other source will result in errors.
#
#Copyright 2021 IBM Corp.
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing,
#software distributed under the License is distributed on an
#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
#either express or implied. See the License for the specific
#language governing permissions and limitations under the License.
#####################################################################
import sys
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import platform
import os
#Make sure we have plenty of potential data points to plot.
plt.rcParams['agg.path.chunksize']=10000
#Disable false positive warning
pd.options.mode.chained_assignment = None # default='warn'
#Which system are we running on?
system = platform.system()
keys = {"JQE":"Q","SPOOL":"S","BERT":"B","JOE":"J"}
user_keys = ["JQE","SPOOL","BERT","JOE"]
resource_header_data = ["Resource","STCK_Time","Current_Usage","Date_Time"]
capacity_header_data = ["Resource","Capacity"]
check_name = "PFA_JES2_Resource_Exhaustion"
COLUMN_CHAR_LEN = 8
#Parse our command line arguments.
if(len(sys.argv) == 4):
data_filepath = sys.argv[1]
capacity_filepath = sys.argv[2]
key = sys.argv[3]
key = key.upper()
verbose = False
elif(len(sys.argv) == 5 and (sys.argv[4] == '-v' or sys.argv[4] == '-verbose')):
data_filepath = sys.argv[1]
capacity_filepath = sys.argv[2]
key = sys.argv[3]
key = key.upper()
verbose = True
elif(len(sys.argv) == 2 and (sys.argv[1] == '-h' or sys.argv[1] == '-help')):
print("The proper syntax for this script is the following:\n")
print("'python Graph_JRE_Data.py data_file capacity_file jes2_resource'.\n")
print("Valid JES2 Resources are: "+ str([key for key in user_keys]) + '\n')
print("The file path values are case sensitive, but the JES2 resource is not.\n")
print("For example, if this script and the required files are in the same directory, you would specify the following to graph the JES2 Spool data on system SY1:\n")
print("'python Graph_JRE_Data.py SY1.5day.data SY1.capacity SPOOL'\n")
print("You can also add -v to the end of the command for verbose mode. This option will print additional data ")
print("that could help debug errors or verify the results. An example using verbose mode looks like the following:\n")
print("'python Graph_JRE_Data.py SY1.5day.data Capacity.data BERT -v'\n")
print("When this script is executed on z/OS, it saves the graph in a .pdf file that can be downloaded from the directory where this script was executed and displayed anywhere that supports displaying a .pdf file.")
print("The file name is in the format of JESResource_graph.pdf.")
print("For example, if you entered 'python Graph_JRE_Data.py SY1.5day.data SY1.capacity SPOOL' on z/OS the saved file would be:")
print("SPOOL_graph.pdf and it would be located in the current working directory.")
sys.exit()
else:
raise Exception("The supplied arguments are not correct. Specify the data_file_path, capacity_file_path, and JES2 resource in that order. For help enter 'python Graph_JRE_Data.py -h'")
#Make sure we have proper input from the user.
if(not os.path.exists(data_filepath)):
raise Exception("The specified file or filepath for the data file does not exist. Verify the file and filepath then try again.")
if(not os.path.exists(capacity_filepath)):
raise Exception("The specified file or filepath for the capacity file does not exist. Verify the file and filepath then try again.")
if key not in user_keys:
raise Exception("The specified resource does not exist. Specify a resource that exists.")
#Load up our data and assign correct header values so we can narrow it down to the pieces we want.
data_file = pd.read_csv(data_filepath,
sep="/|,",
names=resource_header_data,
header=None,
engine="python")
capacity_file = pd.read_csv(capacity_filepath,
sep="/|,",
names=capacity_header_data,
header=None,
engine="python")
user_key = key
key = keys[user_key]
user_key = user_key.ljust(COLUMN_CHAR_LEN)
data_file = data_file.join(capacity_file["Capacity"])
NUM_TO_PRINT = 10
PDF_FILENAME = user_key.strip()+"_graph.pdf" #This is the name of the .pdf file that gets saved when this script is ran on z/OS
def process_data(data_file, capacity_file):
the_capacity = capacity_file.loc[capacity_file['Resource'] == user_key,'Capacity'].values[0]
the_data = data_file.loc[data_file['Resource'] == user_key]
the_data['Capacity'].fillna(the_capacity, inplace=True)
the_data['Capacity'] = the_data['Capacity'].astype(int)
the_data.loc[:,('Date_Time')] = pd.to_datetime(the_data['Date_Time'].astype(str), format='%Y%m%d%H%M%S')
if(verbose):
print_details(the_data, NUM_TO_PRINT)
return the_data
def graph_data(the_data):
y_values = [0,(the_data['Capacity'].max())*.25,(the_data['Capacity'].max())*.50,(the_data['Capacity'].max())*.75,(the_data['Capacity'].max())]
y_ticks = [str(int(y)) for y in y_values]
fig, ax = plt.subplots()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))
ax.set_ylim(0,the_data['Capacity'].max()*1.10)
ax.plot(the_data['Date_Time'],the_data['Capacity'],'--r', label='Capacity')
ax.plot(the_data['Date_Time'],the_data['Current_Usage']/1024,'-b', label='Current Usage')
fig.suptitle(check_name + "\n" + user_key, fontsize=16)
plt.yticks(y_values, y_ticks)
plt.xlabel('Month-Day Time')
fig.autofmt_xdate()
ax.legend(bbox_to_anchor=(1.41, 1),loc="upper right")
fig.subplots_adjust(right=0.75)
if system != 'z/OS':
plt.show();
else:
fig.savefig(PDF_FILENAME)
def print_details(data_frame, num_to_print):
print("Now graphing " + check_name + " data on a " + system + " system.")
print("JES2 resource is: " + user_key.strip())
print("data_filepath entered: " + data_filepath)
print("capacity_filepath entered was: " + capacity_filepath)
print("\nPreview of the data being graphed:")
print(data_frame.head(num_to_print).to_string(index=False))
#Process and graph our data.
the_data = process_data(data_file, capacity_file)
user_key = user_key.strip()
graph_data(the_data)
if system == 'z/OS':
print(PDF_FILENAME + ' has been created and is ready to be downloaded and viewed.')