Created
May 20, 2025 04:48
-
-
Save beanvuvanhau/a2d2157148d755d3a576a7b3165d7806 to your computer and use it in GitHub Desktop.
Log Validation Results
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Log Validation Report</title> | |
<script> | |
/*! | |
* Chart.js v4.4.9 | |
* https://www.chartjs.org | |
* (c) 2025 Chart.js Contributors | |
* Released under the MIT License | |
*/ | |
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Zo},get Decimation(){return ta},get Filler(){return xa},get Legend(){return va},get SubTitle(){return Sa},get Title(){return wa},get Tooltip(){return Wa}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(o(t))for(l=Object.keys(t),r=l.length,a=0;a<r;a++)e.call(i,t[l[a]],l[a])}function f(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function g(t){if(n(t))return t.map(g);if(o(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=g(t[i[n]]);return e}return t}function p(t){return-1==["__proto__","prototype","constructor"].indexOf(t)}function m(t,e,i,s){if(!p(t))return;const a=Object.getOwnPropertyDescriptor(t,e);a&&!a.configurable||(a&&a.get&&!a.set?delete t[e]:Object.defineProperty(t,e,{value:i,writable:!0,enumerable:!0,configurable:!0}))}function x(t,e,i){const s=n(e)?e:[e],a=s.length;if(!o(t))return t;const r=(i=i||{}).merger||m;let l;for(let h=0;h<a;++h)if(l=s[h],o(l))for(const c in l)r(t,c,l[c],i);return t}function b(t,e){return x(t,e,{merger:_})}function _(t,e,i){if(!p(t))return;const s=Object.getOwnPropertyDescriptor(t,e);s&&!s.configurable||(s&&s.get&&!s.set?delete t[e]:Object.defineProperty(t,e,{value:i,writable:!0,enumerable:!0,configurable:!0}))}const y={x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)<i}function b(t){const e=Math.round(t);t=V(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(z(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function w(t){const e=[];let i,s;for(i=1;i<t;i++)t%i==0&&(e.push(i),e.push(t/i));return e.sort(((t,e)=>t-e)).pop(),e}function N(t){return!function(t){return"symbol"==typeof t||"object"==typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function $(t){return t*(C/180)}function y(t){return t*(180/C)}function u(t){if(!a(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function x(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*C&&(o+=O),{angle:o,distance:n}}function q(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function k(t,e){return(t-e+A)%O-C}function g(t){return(t%O+O)%O}function z(t,e,i,s){const n=G(t),o=G(e),a=G(i),r=G(o-n),l=G(a-n),h=G(n-o),c=G(n-a);return r>l&&h<c}function j(t,e,i){return Math.max(e,Math.min(i,t))}function q(t){return j(t,-32768,32767)}function tt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),st=(t,e,i)=>e...(truncated)...});</script> | |
<style> | |
body { | |
font-family: Arial, sans-serif; | |
margin: 20px; | |
} | |
h1, h2 { | |
color: #2c3e50; | |
} | |
.product { | |
border: 1px solid #ccc; | |
border-radius: 8px; | |
margin-bottom: 20px; | |
padding: 15px; | |
} | |
.services { | |
font-style: italic; | |
color: #555; | |
margin-bottom: 10px; | |
} | |
table { | |
width: 100%; | |
border-collapse: collapse; | |
margin-top: 10px; | |
} | |
th, td { | |
padding: 6px 8px; | |
border: 1px solid #ddd; | |
text-align: left; | |
font-size: 13px; | |
} | |
th { | |
background-color: #f4f4f4; | |
} | |
.failed { | |
color: red; | |
font-weight: bold; | |
} | |
.success { | |
color: green; | |
} | |
.summary { | |
margin-bottom: 20px; | |
} | |
.report-info { | |
background-color: #f8f9fa; | |
border: 1px solid #e9ecef; | |
border-radius: 8px; | |
padding: 15px; | |
margin-bottom: 20px; | |
} | |
.report-info p { | |
margin: 5px 0; | |
color: #495057; | |
} | |
.report-info .label { | |
font-weight: bold; | |
color: #2c3e50; | |
} | |
.stats-container { | |
display: flex; | |
flex-wrap: wrap; | |
gap: 20px; | |
margin-top: 20px; | |
} | |
.stat-box { | |
flex: 1; | |
min-width: 200px; | |
background: #fff; | |
border: 1px solid #e9ecef; | |
border-radius: 8px; | |
padding: 15px; | |
box-shadow: 0 2px 4px rgba(0,0,0,0.05); | |
} | |
.stat-title { | |
font-size: 14px; | |
color: #6c757d; | |
margin-bottom: 10px; | |
} | |
.stat-value { | |
font-size: 24px; | |
font-weight: bold; | |
color: #2c3e50; | |
margin-bottom: 10px; | |
} | |
.stat-bar { | |
height: 8px; | |
background: #e9ecef; | |
border-radius: 4px; | |
overflow: hidden; | |
} | |
.stat-bar-fill { | |
height: 100%; | |
border-radius: 4px; | |
transition: width 0.3s ease; | |
} | |
.stat-bar-products { background-color: #9b59b6; } | |
.stat-bar-services { background-color: #3498db; } | |
.stat-bar-success { background-color: #2ecc71; } | |
.stat-bar-failed { background-color: #e74c3c; } | |
</style> | |
</head> | |
<body> | |
<h1>π Log Validation Summary Report</h1> | |
<div class="report-info"> | |
<p><span class="label">Date:</span> 2025-05-20-11-48</p> | |
<p><span class="label">Environment:</span> Production</p> | |
</div> | |
<div class="summary"> | |
<h2>π Summary Overview</h2> | |
<div class="stats-container"> | |
<div class="stat-box"> | |
<div class="stat-title">Products</div> | |
<div class="stat-value">1</div> | |
<div class="stat-bar"> | |
<div class="stat-bar-fill stat-bar-products" style="width: 100%"></div> | |
</div> | |
</div> | |
<div class="stat-box"> | |
<div class="stat-title">Services</div> | |
<div class="stat-value">1</div> | |
<div class="stat-bar"> | |
<div class="stat-bar-fill stat-bar-services" style="width: 100%"></div> | |
</div> | |
</div> | |
<div class="stat-box"> | |
<div class="stat-title">Success Rules</div> | |
<div class="stat-value">3</div> | |
<div class="stat-bar"> | |
<div class="stat-bar-fill stat-bar-success" style="width: 100%"></div> | |
</div> | |
</div> | |
<div class="stat-box"> | |
<div class="stat-title">Failed Rules</div> | |
<div class="stat-value">0</div> | |
<div class="stat-bar"> | |
<div class="stat-bar-fill stat-bar-failed" style="width: 0%"></div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div class="product"> | |
<h2>Product: asset-accounting</h2> | |
<p class="services">Services: asset-accounting-backend</p> | |
<table> | |
<tr> | |
<th>Rule</th> | |
<th>Success</th> | |
<th>Failed</th> | |
<th>Failed Services</th> | |
</tr> | |
<tr> | |
<td>Rule 1 - Log Format</td> | |
<td class="success">1</td> | |
<td class="success">0</td> | |
<td>β</td> | |
</tr> | |
<tr> | |
<td>Rule 2 - Log Parameters</td> | |
<td class="success">1</td> | |
<td class="success">0</td> | |
<td>β</td> | |
</tr> | |
<tr> | |
<td>Rule 3 - Log Sensitive Data</td> | |
<td class="success">1</td> | |
<td class="success">0</td> | |
<td>β</td> | |
</tr> | |
</table> | |
</div> | |
<script> | |
const ctx = document.getElementById('summaryChart').getContext('2d'); | |
const totalProducts = 1; | |
const totalServices = 1; | |
const totalSuccess = 3; | |
const totalFailed = 0; | |
new Chart(ctx, { | |
type: 'bar', | |
data: { | |
labels: ['Product Count', 'Services Count', 'Success Rule Count', 'Failed Rule Count'], | |
datasets: [{ | |
label: 'Log Summary', | |
data: [totalProducts, totalServices, totalSuccess, totalFailed], | |
backgroundColor: ['#9b59b6', '#3498db', '#2ecc71', '#e74c3c'] | |
}] | |
}, | |
options: { | |
responsive: false, | |
plugins: { | |
legend: { display: false } | |
}, | |
scales: { | |
y: { | |
beginAtZero: true, | |
ticks: { | |
precision: 0, | |
font: { size: 12 } | |
} | |
}, | |
x: { | |
ticks: { font: { size: 12 } } | |
} | |
} | |
} | |
}); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment