This commit is contained in:
dennis 2023-09-11 10:53:50 +02:00
parent 5b0b3badbb
commit 8316e6d0e2
8 changed files with 274 additions and 23 deletions

8
.gitignore vendored
View File

@ -1,3 +1,11 @@
/.venv/Lib
/.venv/Scripts
/.venv/share
/__pycache__
__pycache__/env.cpython-311.pyc
__pycache__/FlowAnalyserMain.cpython-311.pyc
__pycache__/FlowTest.cpython-311.pyc
__pycache__/inn.cpython-311.pyc
__pycache__/koerselsOverblikUtils.cpython-311.pyc
__pycache__/sysjob2html.cpython-311.pyc
__pycache__/sysjobs.cpython-311.pyc

View File

@ -0,0 +1,164 @@
/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
/* Greenlet object interface */
#ifndef Py_GREENLETOBJECT_H
#define Py_GREENLETOBJECT_H
#include <Python.h>
#ifdef __cplusplus
extern "C" {
#endif
/* This is deprecated and undocumented. It does not change. */
#define GREENLET_VERSION "1.0.0"
#ifndef GREENLET_MODULE
#define implementation_ptr_t void*
#endif
typedef struct _greenlet {
PyObject_HEAD
PyObject* weakreflist;
PyObject* dict;
implementation_ptr_t pimpl;
} PyGreenlet;
#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type))
/* C API functions */
/* Total number of symbols that are exported */
#define PyGreenlet_API_pointers 12
#define PyGreenlet_Type_NUM 0
#define PyExc_GreenletError_NUM 1
#define PyExc_GreenletExit_NUM 2
#define PyGreenlet_New_NUM 3
#define PyGreenlet_GetCurrent_NUM 4
#define PyGreenlet_Throw_NUM 5
#define PyGreenlet_Switch_NUM 6
#define PyGreenlet_SetParent_NUM 7
#define PyGreenlet_MAIN_NUM 8
#define PyGreenlet_STARTED_NUM 9
#define PyGreenlet_ACTIVE_NUM 10
#define PyGreenlet_GET_PARENT_NUM 11
#ifndef GREENLET_MODULE
/* This section is used by modules that uses the greenlet C API */
static void** _PyGreenlet_API = NULL;
# define PyGreenlet_Type \
(*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM])
# define PyExc_GreenletError \
((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM])
# define PyExc_GreenletExit \
((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM])
/*
* PyGreenlet_New(PyObject *args)
*
* greenlet.greenlet(run, parent=None)
*/
# define PyGreenlet_New \
(*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \
_PyGreenlet_API[PyGreenlet_New_NUM])
/*
* PyGreenlet_GetCurrent(void)
*
* greenlet.getcurrent()
*/
# define PyGreenlet_GetCurrent \
(*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
/*
* PyGreenlet_Throw(
* PyGreenlet *greenlet,
* PyObject *typ,
* PyObject *val,
* PyObject *tb)
*
* g.throw(...)
*/
# define PyGreenlet_Throw \
(*(PyObject * (*)(PyGreenlet * self, \
PyObject * typ, \
PyObject * val, \
PyObject * tb)) \
_PyGreenlet_API[PyGreenlet_Throw_NUM])
/*
* PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
*
* g.switch(*args, **kwargs)
*/
# define PyGreenlet_Switch \
(*(PyObject * \
(*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \
_PyGreenlet_API[PyGreenlet_Switch_NUM])
/*
* PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
*
* g.parent = new_parent
*/
# define PyGreenlet_SetParent \
(*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \
_PyGreenlet_API[PyGreenlet_SetParent_NUM])
/*
* PyGreenlet_GetParent(PyObject* greenlet)
*
* return greenlet.parent;
*
* This could return NULL even if there is no exception active.
* If it does not return NULL, you are responsible for decrementing the
* reference count.
*/
# define PyGreenlet_GetParent \
(*(PyGreenlet* (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_GET_PARENT_NUM])
/*
* deprecated, undocumented alias.
*/
# define PyGreenlet_GET_PARENT PyGreenlet_GetParent
# define PyGreenlet_MAIN \
(*(int (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_MAIN_NUM])
# define PyGreenlet_STARTED \
(*(int (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_STARTED_NUM])
# define PyGreenlet_ACTIVE \
(*(int (*)(PyGreenlet*)) \
_PyGreenlet_API[PyGreenlet_ACTIVE_NUM])
/* Macro that imports greenlet and initializes C API */
/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we
keep the older definition to be sure older code that might have a copy of
the header still works. */
# define PyGreenlet_Import() \
{ \
_PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
}
#endif /* GREENLET_MODULE */
#ifdef __cplusplus
}
#endif
#endif /* !Py_GREENLETOBJECT_H */

View File

@ -1,5 +1,5 @@
home = C:\Python311
home = C:\Users\denker\AppData\Local\Programs\Python\Python311
include-system-site-packages = false
version = 3.11.4
executable = C:\Python311\python.exe
command = C:\Python311\python.exe -m venv --upgrade C:\users\denker\Documents\udvikling\Python\FlowAnalyser\.venv
executable = C:\Users\denker\AppData\Local\Programs\Python\Python311\python.exe
command = C:\Users\denker\AppData\Local\Programs\Python\Python311\python.exe -m venv C:\Users\denker\Udvikling\FlowAnalyser\.venv

View File

@ -9,6 +9,7 @@ import logging
from dateutil import tz
from pytz import timezone
import koerselsOverblikUtils
from koerselsOverblikUtils import OverblikDag
def create_app(test_config=None):
# create and configure the app
@ -38,21 +39,8 @@ def create_app(test_config=None):
return FlowTest.test()
@FlowAnalyserMain.route('/test')
def test():
listSysjobs=[]
listStartSlutjobs=[Sysjobs.getSysjob(session,'BI - Flow - Batch Start Daglig kl. 20.00',True)[0][0]]
listStartSlutjobs.append(Sysjobs.getSysjob(session,'BI - Flow - Batch Slut Daglig kl. 20.00',True)[0][0])
listStartSlutjobs=koerselsOverblikUtils.convertToAlike(listStartSlutjobs,0,30,0)
sysjobsAlike=koerselsOverblikUtils.timeRangeMerge(listStartSlutjobs, "Batch køretid",0,30,2)
listSysjobs.append(sysjobsAlike)
listSysjobs.extend(listStartSlutjobs)
sysjobs=Sysjobs.getSysjob(session,'% - Admin - %',False)
sysjobs=[a for a in sysjobs if a[0].name not in ["BI - Admin - Kill Blocking Queries","BI - Admin - Flow Job Restarter"]]
if(sysjobs!=None and len(sysjobs)>0):
sysjobs=koerselsOverblikUtils.convertToAlike(sysjobs,0,30,2)
listSysjobs.extend(sysjobs)
listSysjobs = [x for x in listSysjobs if len(x.getMedianDag(0,30,2))>0]
listSysjobs = sorted(listSysjobs, key=lambda x: x.getMedianDag(0,30,2)[0])
return render_template('index.html', test=listSysjobs)#,startSlut=listStartSlutjobs)
return render_template('index.html', overblikDag=OverblikDag(session))
#return render_template('index.html', test=listSysjobs6)#,startSlut=listStartSlutjobs)
@FlowAnalyserMain.route('/test3')
def test3():
sysjobs=(Sysjobs.getNattensKoersel(session))

2
env.py
View File

@ -1,4 +1,4 @@
server = 'bi-dsa-udv\dsa' # to
database = 'udv_denker'
username = 'admindenker'
password = 'biadmin#kode4rmO1'
password = 'Min!sterTj€n€r€nhv3r$ta7s11g3'

View File

@ -1,8 +1,37 @@
from datetime import datetime
from typing import List
from typing import Dict, List
from sysjobs import Sysjobs
class SysjobsGroup:
name = None
listOfSysjobsInGroup:List['Sysjobs'] = []
def __init__(self,name,sysjobs:List['Sysjobs']):
self.name=name
if(sysjobs!=None and len(sysjobs)>0):
self.listOfSysjobsInGroup=sysjobs
def addToGroup(self,sysjob:Sysjobs):
self.listOfSysjobsInGroup.append(sysjob)
def getSysjobsAlike(self,stepId,antalDage,ugeDage):
sysjobsAlike=SysjobsAlike(self.name)
sysjobsAlike
sysjobsAlike.stepId=stepId
sysjobsAlike.antalDage=antalDage
sysjobsAlike.ugeDage=ugeDage
for job in self.listOfSysjobsInGroup:
if(not isinstance(job,Sysjobs)):
job=job[0]
medianDag=job.getMedianDag(stepId,antalDage,ugeDage)
if sysjobsAlike.startTime is None or sysjobsAlike.startTime>medianDag[0]:
sysjobsAlike.startTime=medianDag[0]
if sysjobsAlike.endTime is None or sysjobsAlike.endTime<medianDag[1]:
sysjobsAlike.endTime=medianDag[1]
return sysjobsAlike
class SysjobsAlike:
name=None
startTime=None
@ -53,3 +82,36 @@ def convertToAlike(mainList : List,stepId,antalDage,ugeDage):
jobAlike.endTime=medianDag[1]
returnList.append(jobAlike)
return returnList
def getOverblikDag(session,dag,resList,):
return
class OverblikDag:
session=None
dagsList:Dict={}
def __init__(self,session):
self.session=session
def getKoerselsOverblikForDag(self,dag):
if(self.dagsList.get(dag)==None):
listSysjobs=[]
startStobjobs:Sysjobs = []
startStobjobs.append(Sysjobs.getSysjob(self.session,'BI - Flow - Batch Start Daglig kl. 20.00',True)[0][0])
startStobjobs.append(Sysjobs.getSysjob(self.session,'BI - Flow - Batch Slut Daglig kl. 20.00',True)[0][0])
startStopGroup=SysjobsGroup("Batch Kørsel",startStobjobs)
sysjobs=Sysjobs.getSysjob(self.session,'% - Admin - %',False)
sysjobs=[a for a in sysjobs if a[0].name not in ["BI - Admin - Kill Blocking Queries","BI - Admin - Flow Job Restarter"]]
adminPostJobs=SysjobsGroup("Batch kørsel post jobs - Admin",[a for a in sysjobs if a[0].name in ["BI - Admin - Log TableRowCounts","BI - Admin - BiBackup","BI - Admin - shrink staging filgruppe samt log filer","BI - Admin - Dimension and Map Table checker","BI - Admin - Log Post Batch Flow",
"BI - Admin - Sikkerhedskontrol","BI - Admin - Check Indexes"]])
sysjobs=[a for a in sysjobs if a[0].name not in [a[0].name for a in adminPostJobs.listOfSysjobsInGroup]]
sysjobs.extend(startStobjobs)
sysjobs=convertToAlike(sysjobs,0,30,dag)
sysjobs.append(startStopGroup.getSysjobsAlike(0,30,dag))
sysjobs.append(adminPostJobs.getSysjobsAlike(0,30,dag))
self.dagsList[dag]=sorted(sysjobs, key=lambda x: x.getMedianDag(0,30,dag)[0])
return self.dagsList.get(dag)

Binary file not shown.

View File

@ -18,7 +18,7 @@
data.addRows([
{% set test = overblikDag.getKoerselsOverblikForDag(1) %}
{% for job in test %}
['{{ job.name }}','{{ job.name }}',new Date("{{ job.getMedianDag(0,30,2)[0] }}"),new Date("{{ job.getMedianDag(0,30,2)[1] }}")],
{% endfor %}
@ -32,8 +32,37 @@
chart.draw(data, options);
}
</script>
</head>
<script type="text/javascript">
google.charts.load('current', {'packages':['timeline']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var container = document.getElementById('chart2_div');
var chart = new google.visualization.Timeline(container);
var data = new google.visualization.DataTable();
data.addColumn({ type: 'string', id: 'President' });
data.addColumn({ type: 'string', id: 'President2' });
data.addColumn({ type: 'date', id: 'Start' });
data.addColumn({ type: 'date', id: 'End' });
data.addRows([
{% set test = overblikDag.getKoerselsOverblikForDag(2) %}
{% for job in test %}
['{{ job.name }}','{{ job.name }}',new Date("{{ job.getMedianDag(0,30,2)[0] }}"),new Date("{{ job.getMedianDag(0,30,2)[1] }}")],
{% endfor %}
]);
var calHeight = data.getNumberOfRows() * 45
var options = {
height: calHeight,
timeline: { groupByRowLabel: true }
};
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
<div id="chart2_div"></div>
</body>
</html>