හැමෝටම ආයුබෝවන්! මාස කිහිපයකට පෙර, අපි අපගේ නව විවෘත මූලාශ්ර ව්යාපෘතිය, Kubernetes අධීක්ෂණය සඳහා Grafana ප්ලගිනයක්, නිෂ්පාදනයට දියත් කළෙමු. ප්ලගින මූල කේතය ලබා ගත හැක්කේ මෙම ලිපියෙන්, අපි ප්ලගිනය නිර්මාණය කළ ආකාරය, අප භාවිතා කළ මෙවලම් සහ සංවර්ධනයේදී අපට හමු වූ අන්තරායන් පිළිබඳ කතාව ඔබ සමඟ බෙදා ගැනීමට අපි කැමැත්තෙමු. අපි ආරම්භ කරමු!
0 කොටස - හැඳින්වීම: අපි මෙහි පැමිණියේ කෙසේද?
ග්රැෆනා සඳහා අපේම ප්ලගිනයක් ලිවීමේ අදහස අපට පැමිණියේ අහම්බෙන්. අපගේ සමාගම වසර 10 කට වැඩි කාලයක් තිස්සේ විවිධ සංකීර්ණතාවයෙන් යුත් වෙබ් ව්යාපෘති නිරීක්ෂණය කරමින් සිටී. මෙම කාලය තුළ, අපි විවිධ අධීක්ෂණ පද්ධති භාවිතා කරමින් විශේෂඥතාව, රසවත් සිද්ධි අධ්යයන සහ අත්දැකීම් රාශියක් රැස් කරගෙන ඇත්තෙමු. යම් අවස්ථාවක දී, අපි කල්පනා කළෙමු: "කුබර්නෙට්ස් නිරීක්ෂණය සඳහා ඔබට ඔවුන් පවසන පරිදි, 'එය සකසා අමතක කළ හැකි' මැජික් මෙවලමක් තිබේද?" ස්වාභාවිකවම, ප්රොමිතියස් + ග්රැෆනා සංයෝජනය K8S අධීක්ෂණය සඳහා කර්මාන්ත ප්රමිතිය වී ඇත. මෙම තොගය සඳහා සූදානම් කළ මෙවලම් පුළුල් පරාසයක් පවතී, ඒවාට ප්රොමිතියස්-ක්රියාකරු, කුබර්නෙට්ස්-මික්සින් උපකරණ පුවරු කට්ටලය සහ ග්රැෆනා-කුබර්නෙට්ස්-ඇප් ඇතුළත් වේ.
grafana-kubernetes-app ප්ලගිනය අපට වඩාත්ම සිත්ගන්නා විකල්පය ලෙස පෙනුනද, එය වසරකට වැඩි කාලයක් තිස්සේ සහාය නොදක්වා ඇති අතර, ඊටත් වඩා, node-exporter සහ kube-state-metrics හි නව අනුවාද සමඟ ක්රියා නොකරයි. යම් අවස්ථාවක දී, අපි තීරණය කළේ, "අපේම විසඳුමක් නිර්මාණය නොකරන්නේ ඇයි?"
අපගේ ප්ලගිනය තුළ ක්රියාත්මක කිරීමට අප තීරණය කළ අදහස් මොනවාද?
- යෙදුම් සිතියම් දෘශ්යකරණය: නාම අවකාශයන්, ස්ථානගත කිරීම් ආදිය අනුව කාණ්ඩගත කර ඇති පොකුරක් තුළ යෙදුම්වල පහසු නිරූපණයක්;
- "යෙදීම - සේවා (+වරාය)" ආකාරයේ සම්බන්ධතා දෘශ්යකරණය කිරීම.
- පොකුරු නෝඩ් හරහා පොකුරු යෙදුම් බෙදා හැරීම දෘශ්යකරණය කිරීම.
- බහු මූලාශ්රවලින් මිනුම් සහ තොරතුරු රැස් කිරීම: Prometheus සහ k8s api සේවාදායකය.
- යටිතල පහසුකම් (CPU කාලය, මතකය, තැටි උප පද්ධතිය, ජාලය භාවිතය) සහ යෙදුම් තර්කනය යන දෙකම නිරීක්ෂණය කිරීම - පොඩ් වල සෞඛ්ය තත්ත්වය, පවතින අනුරූ ගණන සහ සජීවී බව/සූදානම පරීක්ෂණවල ප්රගතිය පිළිබඳ තොරතුරු.
1 කොටස: ග්රැෆනා ප්ලගිනයක් යනු කුමක්ද?
තාක්ෂණික දෘෂ්ටි කෝණයකින්, ග්රැෆනා සඳහා ප්ලගිනයක් යනු ග්රැෆනා හි දත්ත නාමාවලියෙහි ගබඩා කර ඇති කෝණික පාලකයකි (/var/grafana/ප්ලගීන/ /dist/මොඩියුලය.js) සහ SystemJS මොඩියුලයක් ලෙස පූරණය කළ හැක. මෙම නාමාවලියෙහි plugin.json ගොනුවක් ද අඩංගු විය යුතු අතර, එහි ඔබගේ ප්ලගිනය පිළිබඳ සියලු පාර-දත්ත අඩංගු වේ: නම, අනුවාදය, ප්ලගින වර්ගය, ගබඩාව/වෙබ් අඩවිය/බලපත්ර සබැඳි, පරායත්තතා යනාදිය.

මොඩියුලය.ts

ප්ලගිනය.json
තිර රුවෙහි ඔබට දැකිය හැකි පරිදි, අපි plugin.type = app නියම කළෙමු. මෙයට හේතුව Grafana සඳහා ප්ලගීන වර්ග තුනක් තිබීමයි:
විද්වත් කමිටු: වඩාත් සුලභ ප්ලගින වර්ගය - එය ඇතැම් මිනුම් දෘශ්යමාන කිරීම සඳහා පැනලයක් වන අතර විවිධ උපකරණ පුවරු තැනීමට භාවිතා කරයි.
දත්ත මූලාශ්රය: ඕනෑම දත්ත මූලාශ්රයකට ප්ලගින සම්බන්ධකයක් (උදාහරණයක් ලෙස, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
යෙදුම: ග්රැෆනා තුළ ඔබේම ඉදිරිපස යෙදුමක් ගොඩනගා ගැනීමට, ඔබේම HTML පිටු නිර්මාණය කිරීමට සහ විවිධ දත්ත දෘශ්යමාන කිරීම සඳහා දත්ත මූලාශ්රයට අතින් ප්රවේශ වීමට ඉඩ සලසන ප්ලගිනයකි. අනෙකුත් ප්ලගින වර්ග (දත්ත මූලාශ්රය, පැනලය) සහ විවිධ උපකරණ පුවරු ද යැපීම් ලෙස භාවිතා කළ හැකිය.

type = app සමඟ ප්ලගින පරායත්තතා සඳහා උදාහරණය.
ඔබට ක්රමලේඛන භාෂාව ලෙස JavaScript හෝ TypeScript භාවිතා කළ හැකිය (අපි TypeScript තෝරා ගත්තෙමු). ඔබට ඕනෑම ආකාරයක hello-world ප්ලගිනයක් සඳහා සැකිලි සෑදිය හැකිය. : මෙම ගබඩාවේ පෙර ස්ථාපනය කර වින්යාස කරන ලද තනන්නන් සහිත ආරම්භක ඇසුරුම් විශාල සංඛ්යාවක් (ප්රතික්රියා ප්ලගිනයක පර්යේෂණාත්මක උදාහරණයක් පවා ඇත) අඩංගු වේ.
2 කොටස: දේශීය පරිසරය සකස් කිරීම
ප්ලගිනය මත වැඩ කිරීමට, අපට ස්වභාවිකවම පෙර-ස්ථාපිත මෙවලම් සහිත Kubernetes පොකුරක් අවශ්ය වනු ඇත: prometheus, node-exporter, kube-state-metrics, සහ grafana. පරිසරය සැකසීමට ඉක්මන්, පහසු සහ කරදරයකින් තොර විය යුතු අතර, උණුසුම් නැවත පූරණය සහතික කිරීම සඳහා, Grafana දත්ත නාමාවලිය සංවර්ධකයාගේ යන්ත්රයෙන් කෙලින්ම සවි කළ යුතුය.
අපගේ මතය අනුව, Kubernetes සමඟ දේශීයව වැඩ කිරීමට ඇති පහසුම ක්රමය වන්නේ ඊළඟ පියවර වන්නේ prometheus-operator භාවිතයෙන් Prometheus + Grafana බණ්ඩලය ස්ථාපනය කිරීමයි. minikube මත prometheus-operator ස්ථාපනය කිරීමේ ක්රියාවලිය විස්තරාත්මකව විස්තර කර ඇත. නොනැසී පැවතීම සක්රීය කිරීම සඳහා, ඔබ පරාමිතිය සැකසිය යුතුය. නොපසුබට උත්සාහය: සත්යය charts/grafana/values.yaml ගොනුවේ, ඔබේම PV සහ PVC එකතු කර persistence.existingClaim පරාමිතිය තුළ ඒවා සඳහන් කරන්න.
අපගේ අවසාන minikube දියත් කිරීමේ පිටපත මේ වගේ ය:
minikube start --kubernetes-version=v1.13.4 --memory=4096 --bootstrapper=kubeadm --extra-config=scheduler.address=0.0.0.0 --extra-config=controller-manager.address=0.0.0.0
minikube mount
/home/sergeisporyshev/Projects/Grafana:/var/grafana --gid=472 --uid=472 --9p-version=9p2000.L3 කොටස: සෘජු සංවර්ධනය
වස්තු ආකෘතිය
ප්ලගිනය ක්රියාත්මක කිරීම සඳහා සූදානම් වීමේ දී, අපි TypeScript පන්ති ලෙස වැඩ කරන සියලුම මූලික Kubernetes ආයතන නිර්වචනය කිරීමට තීරණය කළෙමු: pod, deployment, daemonset, statefulset, job, cronjob, service, node සහ namespace. මෙම පන්ති සෑම එකක්ම පොදු BaseModel පන්තියකින් උරුම වන අතර, එය constructor, destructor සහ දෘශ්යතාව යාවත්කාලීන කිරීම සහ ටොගල් කිරීම සඳහා ක්රම නිර්වචනය කරයි. සෑම පන්තියක්ම deployment entity සඳහා pods ලැයිස්තුවක් වැනි අනෙකුත් ආයතන සමඟ කැදැලි සම්බන්ධතා ද නිර්වචනය කරයි.
import {Pod} from "./pod";
import {Service} from "./service";
import {BaseModel} from './traits/baseModel';
export class Deployment extends BaseModel{
pods: Array<Pod>;
services: Array<Service>;
constructor(data: any){
super(data);
this.pods = [];
this.services = [];
}
}ලබා ගන්නන් සහ සකසන්නන් භාවිතා කරමින්, අපට අවශ්ය ආයතන මිතික පහසු සහ කියවිය හැකි ආකෘතියකින් ප්රදර්ශනය කිරීමට හෝ සැකසීමට හැකිය. උදාහරණයක් ලෙස, වෙන් කළ හැකි CPU නෝඩ් වල ආකෘතිගත ප්රතිදානය:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}පිටු
අපගේ ප්ලගිනයේ සියලුම පිටු ලැයිස්තුව මුලින් අපගේ pluing.json හි පරායත්තතා අංශයේ විස්තර කර ඇත:

සෑම පිටුවක් සඳහාම බ්ලොක් එකේ, අපි PAGE NAME (මෙය පසුව මෙම පිටුවට ප්රවේශ විය හැකි ස්ලග් එකක් බවට පරිවර්තනය කරනු ලැබේ); මෙම පිටුවේ ක්රියාකාරිත්වය සඳහා වගකිව යුතු සංරචකයේ නම (සංරචක ලැයිස්තුව module.ts වෙත අපනයනය කෙරේ); මෙම පිටුව සමඟ වැඩ කිරීමට ඇති පරිශීලක භූමිකාව සහ පැති තීරුව සඳහා සංචාලන සැකසුම් පිළිබඳ ඇඟවීමක් සඳහන් කළ යුතුය.
පිටුවේ ක්රියාකාරිත්වය සඳහා වගකිව යුතු සංරචකය තුළ, අපි templateUrl සැකසිය යුතු අතර, එය සලකුණු කිරීම අඩංගු HTML ගොනුවට මාර්ගය ලබා දිය යුතුය. පාලකය තුළ, යැපුම් එන්නත් කිරීම හරහා, අපට වැදගත් Angular සේවා දෙකකට ප්රවේශ විය හැකිය:
- backendSrv යනු Grafana API සේවාදායකය සමඟ අන්තර්ක්රියා සපයන සේවාවකි;
- datasourceSrv යනු ඔබගේ Grafana හි ස්ථාපනය කර ඇති සියලුම දත්ත මූලාශ්ර සමඟ දේශීය අන්තර්ක්රියා සපයන සේවාවකි (උදාහරණයක් ලෙස, .getAll() ක්රමය මඟින් ස්ථාපනය කර ඇති සියලුම දත්ත මූලාශ්ර ලැයිස්තුවක් ලබා දෙයි; .get( ) — නිශ්චිත දත්ත මූලාශ්රයක උදාහරණ වස්තුවක් ආපසු ලබා දෙයි.



4 කොටස: දත්ත මූලාශ්රය
ග්රැෆනාගේ දෘෂ්ටිකෝණයෙන්, දත්ත මූලාශ්රයක් යනු වෙනත් ඕනෑම දෙයක් මෙන් ප්ලගිනයකි: එයට තමන්ගේම පිවිසුම් ලක්ෂ්යයක්, module.js සහ මෙටාඩේටා සහිත plugin.json ගොනුවක් ඇත. type = යෙදුම සමඟ ප්ලගිනයක් සංවර්ධනය කිරීමේදී, අපට පවතින දත්ත මූලාශ්ර (උදාහරණයක් ලෙස, prometheus-datasource) හෝ අපගේම ඒවා සමඟ අන්තර් ක්රියා කළ හැකිය, ඒවා අපට ප්ලගින නාමාවලියෙහි (dist/datasource/*) සෘජුවම ගබඩා කළ හැකිය, නැතහොත් යැපීමක් ලෙස ස්ථාපනය කළ හැකිය. අපගේ නඩුවේදී, දත්ත මූලාශ්රය ප්ලගින කේතය සමඟ බණ්ඩල් කර ඇත. දත්ත මූලාශ්ර අවස්ථා වින්යාස පිටුව සහ ඔබේ දත්ත මූලාශ්රය සඳහා තර්කනය ක්රියාත්මක කරන දත්ත මූලාශ්ර පාලකය සඳහා භාවිතා කරන config.html සැකිල්ලක් සහ ConfigCtrl පාලකයක් ද අවශ්ය වේ.
KubeGraf ප්ලගිනය තුළ, පරිශීලක අතුරුමුහුණත දෘෂ්ටිකෝණයකින්, දත්ත මූලාශ්රයක් යනු පහත හැකියාවන් ක්රියාත්මක කරන Kubernetes පොකුරක උදාහරණයකි (මූලාශ්ර කේතය ලබා ගත හැකිය ):
- k8s api සේවාදායකයෙන් දත්ත ලබා ගැනීම (නාම අවකාශ, යෙදවුම් ආදිය ලැයිස්තුවක් ලබා ගැනීම)
- prometheus-datasource වෙත ඉල්ලීම් ප්රොක්සි කිරීම (එය එක් එක් විශේෂිත පොකුර සඳහා ප්ලගින සැකසුම් තුළ තෝරා ගනු ලැබේ) සහ ස්ථිතික පිටු සහ උපකරණ පුවරු දෙකෙහිම දත්ත භාවිතා කිරීම සඳහා ප්රතිචාර ආකෘතිකරණය කිරීම.
- ප්ලගිනයේ ස්ථිතික පිටු වල දත්ත යාවත්කාලීන කිරීම (නියමිත නැවුම් කිරීමේ අනුපාතයක් සහිතව).
- grafana-dashboards හි සැකිලි පත්රයක් ජනනය කිරීම සඳහා විමසුම් සැකසීම (metrod .metriFindQuery())



- අවසාන k8s පොකුර සමඟ සම්බන්ධතා පරීක්ෂණය.
testDatasource(){
let url = '/api/v1/namespaces';
let _url = this.url;
if(this.accessViaToken)
_url += '/__proxy';
_url += url;
return this.backendSrv.datasourceRequest({
url: _url,
method: "GET",
headers: {"Content-Type": 'application/json'}
})
.then(response => {
if (response.status === 200) {
return {status: "success", message: "Data source is OK", title: "Success"};
}else{
return {status: "error", message: "Data source is not OK", title: "Error"};
}
}, error => {
return {status: "error", message: "Data source is not OK", title: "Error"};
})
}අපගේ මතය අනුව, විශේෂයෙන් සිත්ගන්නා කරුණක් වන්නේ දත්ත මූලාශ්රය සඳහා සත්යාපනය සහ බලය පැවරීමේ යාන්ත්රණය ක්රියාත්මක කිරීමයි. සාමාන්යයෙන්, අවසාන දත්ත මූලාශ්රයට ප්රවේශය වින්යාස කිරීමට අපට Grafana හි බිල්ට්-ඉන් datasourceHttpSettings සංරචකය භාවිතා කළ හැකිය. මෙම සංරචකය සමඟින්, URL සහ මූලික සත්යාපන/අවසර සැකසුම් නියම කිරීමෙන් අපට HTTP දත්ත මූලාශ්රයට ප්රවේශය වින්යාස කළ හැකිය: පිවිසුම්/මුරපදය, හෝ සේවාදායක-සහතික/සේවාදායක-යතුර. දරන්නා ටෝකනයක් (k8s සඳහා තථ්ය ප්රමිතිය) භාවිතයෙන් ප්රවේශය වින්යාස කිරීමේ හැකියාව ක්රියාත්මක කිරීම සඳහා යම් යම් ටින්කර් කිරීම් අවශ්ය විය.
මෙම ගැටළුව විසඳීම සඳහා, ඔබට ග්රැෆනා හි බිල්ට්-ඉන් "ප්ලගින මාර්ග" යාන්ත්රණය භාවිතා කළ හැකිය (වැඩි විස්තර සඳහා ). අපගේ දත්ත මූලාශ්ර සැකසුම් තුළ, ග්රැෆනා ප්රොක්සි සේවාදායකය මඟින් සකසන ලද රවුටින් නීති මාලාවක් අපට ප්රකාශ කළ හැකිය. උදාහරණයක් ලෙස, එක් එක් අන්ත ලක්ෂ්යය සඳහා, සැකිලි සහාය ඇතිව ශීර්ෂක හෝ URL සැකසීමේ විකල්පය ඇත, ඒ සඳහා දත්ත jsonData සහ secureJsonData ක්ෂේත්ර වලින් ලබා ගත හැකිය (මුරපද හෝ ටෝකන සංකේතාත්මක ආකාරයෙන් ගබඩා කිරීම සඳහා). අපගේ උදාහරණයේ, පෝරමයේ ඉල්ලීම් /__ප්රොක්සි/api/v1/නාමඅවකාශ පහත ආකාරයේ URL වලට ප්රොක්සි කරනු ලැබේ.
/api/v1/namespaces සඳහා Authorization: Bearer ශීර්ෂ කට්ටලය.


ස්වාභාවිකවම, k8s api සේවාදායකය සමඟ වැඩ කිරීමට, අපට කියවීමට පමණක් ප්රවේශය ඇති පරිශීලකයෙකු අවශ්ය වේ, නිර්මාණය කිරීම සඳහා වන ප්රකාශන ඔබට සොයාගත හැකිය .
5 කොටස: මුදා හැරීම

ඔබ ඔබේම ග්රැෆනා ප්ලගිනයක් ලියූ පසු, ඔබට ස්වභාවිකවම එය විවෘත මූලාශ්රයක් බවට පත් කිරීමට අවශ්ය වනු ඇත. ග්රැෆනා හි, මෙය ප්ලගින පුස්තකාලයකි, එය ලබා ගත හැකිය
ඔබගේ ප්ලගිනය නිල වෙළඳසැලේ ලබා ගත හැකි වීමට නම්, ඔබ PR එකක් කළ යුතුය , repo.json ගොනුවට මෙවැනි අන්තර්ගතයක් එක් කරමින්:

මෙහි version යනු ඔබගේ ප්ලගිනයේ අනුවාදය වන අතර, url යනු ගබඩාවට සබැඳිය වන අතර, commit යනු ප්ලගිනයේ නිශ්චිත අනුවාදය ලබා ගත හැකි commit හි හැෂ් එකයි.
ප්රතිදානයේදී ඔබට මෙවැනි අපූරු පින්තූරයක් පෙනෙනු ඇත:

ඒ සඳහා දත්ත ඔබගේ Readme.md, Changelog.md, සහ plugin.json ගොනුවෙන් ප්ලගින විස්තරය සමඟ ස්වයංක්රීයව ලබා ගනු ඇත.
6 වන කොටස: නිගමන වෙනුවට
අපගේ ප්ලගිනය නිකුත් කළ දා සිට අපි සංවර්ධනය කිරීම නතර කර නැත. අපි දැනට ක්ලස්ටර් නෝඩ් සම්පත් භාවිතය නිසි ලෙස නිරීක්ෂණය කිරීම, පරිශීලක අත්දැකීම වැඩිදියුණු කිරීම සඳහා නව විශේෂාංග ක්රියාත්මක කිරීම සහ ප්ලගිනය ස්ථාපනය කිරීමෙන් පසු අපගේ ගනුදෙනුකරුවන්ගෙන් සහ GitHub හි පරිශීලකයින්ගෙන් අපට ලැබී ඇති විශාල ප්රතිපෝෂණ ප්රමාණය වර්ග කිරීම සඳහා කටයුතු කරමින් සිටිමු (ඔබ ගැටලුවක් තැබුවහොත් හෝ ඉල්ලීමක් ඇදගෙන ගියහොත්, මම ඉතා සතුටු වෙමි :)).
ග්රැෆනා වැනි අපූරු මෙවලමක් තේරුම් ගැනීමට සහ සමහර විට ඔබේම ප්ලගිනයක් ලිවීමට මෙම ලිපිය ඔබට උපකාරී වනු ඇතැයි අපි බලාපොරොත්තු වෙමු.
ඔයාට ස්තූතියි!)
මූලාශ්රය: www.habr.com
