D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
usr
/
share
/
grafana
/
public
/
build
/
Filename :
pyroscopePlugin.c84aaed8a487cb0f026b.js
back
Copy
"use strict";(self.webpackChunkgrafana=self.webpackChunkgrafana||[]).push([[8693],{86105:($,h,l)=>{l.r(h),l.d(h,{plugin:()=>Ve});var x=l(68246),o=l(27702),S=l(26811),b=l(29956),v=l(10864),k=l(49257),E=l(82367),N=l(61203),U=l(63439),j=l(12308),Z=l(6570),K=l.n(Z),G=l(45383),A=l(62247),H=l(42751),J=l(39317),P=l(73308);const X="both",Y={groupBy:[],labelSelector:"{}"};class R extends H.CK{constructor(e,a=(0,J.J)()){super(e),this.templateSrv=a,this.backendType=e.jsonData.backendType??"phlare"}query(e){const a=e.targets.filter(n=>n.profileTypeId).map(n=>n.labelSelector===""?{...n,labelSelector:"{}"}:I(n,e.app));return a.length?super.query({...e,targets:a}):(0,G.of)({data:[]})}async getProfileTypes(){return await super.getResource("profileTypes")}async getLabelNames(e,a,n){return await super.getResource("labelNames",{query:e,start:a,end:n})}async getLabelValues(e,a,n,r){return await super.getResource("labelValues",{label:a,query:e,start:n,end:r})}async getBackendType(e){return await super.getResource("backendType",{url:e})}applyTemplateVariables(e,a){return{...e,labelSelector:this.templateSrv.replace(e.labelSelector??"",a)}}async importFromAbstractQueries(e){return e.map(a=>this.importFromAbstractQuery(a))}importFromAbstractQuery(e){return{refId:e.refId,labelSelector:(0,P.PL)(e),queryType:"both",profileTypeId:"",groupBy:[]}}async exportToAbstractQueries(e){return e.map(a=>this.exportToAbstractQuery(a))}exportToAbstractQuery(e){const a=e.labelSelector;if(!a||a.length===0)return{refId:e.refId,labelMatchers:[]};const n=K().tokenize(a,q);return{refId:e.refId,labelMatchers:(0,P.UO)(n)}}getDefaultQuery(e){return w}}const w={...Y,queryType:X};function I(t,e){let a={...w,...t};return e!==A.zj.Explore&&a.queryType==="both"&&(a.queryType="profile"),a}const q={"context-labels":{pattern:/\{[^}]*(?=}?)/,greedy:!0,inside:{comment:{pattern:/#.*/},"label-key":{pattern:/[a-zA-Z_]\w*(?=\s*(=|!=|=~|!~))/,alias:"attr-name",greedy:!0},"label-value":{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0,alias:"attr-value"},punctuation:/[{]/}},punctuation:/[{}(),.]/},_=t=>{const{options:e,onOptionsChange:a}=t,[n,r]=o.useState(),c=(0,v.F)(),[,s]=(0,S.Z)(async()=>{if(!e.url)return;const u=await c.get({type:e.type,uid:e.uid});if(!(u instanceof R))throw new Error("Datasource is not a PhlareDataSource");const{backendType:i}=await u.getBackendType(e.url);if(i==="unknown"){r(void 0);return}if(e.jsonData.backendType){i!==e.jsonData.backendType?r(i):r(void 0);return}a({...e,jsonData:{...e.jsonData,backendType:i}})},[e]);return(0,b.Z)(s,500,[e]),o.createElement(o.Fragment,null,o.createElement(k.E,{defaultUrl:"http://localhost:4100",dataSourceConfig:e,showAccessOptions:!1,onChange:a,secureSocksDSProxyEnabled:j.config.secureSocksDSProxyEnabled}),o.createElement("h3",{className:"page-heading"},"Querying"),o.createElement("div",{className:"gf-form-group"},o.createElement("div",{className:"gf-form-inline"},o.createElement("div",{className:"gf-form"},o.createElement(E.LegacyForms.FormField,{label:"Minimal step",labelWidth:13,inputEl:o.createElement(E.LegacyForms.Input,{className:"width-6",value:e.jsonData.minStep,spellCheck:!1,placeholder:"15s",onChange:u=>{a({...e,jsonData:{...e.jsonData,minStep:u.currentTarget.value}})},validationEvents:{[N.JU.onBlur]:[(0,N.FE)(/^$|^\d+(ms|[Mwdhmsy])$/,"Value is not valid, you can use number with time unit specifier: y, M, w, d, h, m, s")]}}),tooltip:"Minimal step used for metric query. Should be the same or higher as the scrape interval setting in the Phlare database."}))),o.createElement("div",{className:"gf-form-inline"},o.createElement("div",{className:"gf-form"},o.createElement(E.LegacyForms.FormField,{label:"Backend type",labelWidth:13,inputEl:o.createElement(E.LegacyForms.Select,{allowCustomValue:!1,value:e.jsonData.backendType?F[e.jsonData.backendType]:void 0,options:Object.values(F),onChange:u=>{a({...e,jsonData:{...e.jsonData,backendType:u.value}})}}),tooltip:"Select what type of backend you use. This datasource supports both Phlare and Pyroscope backends."}))),n&&o.createElement(U.b,{title:`"${e.jsonData.backendType}" option is selected but it seems like you are using "${n}" backend.`,severity:"warning"})))},F={phlare:{label:"Phlare",value:"phlare"},pyroscope:{label:"Pyroscope",value:"pyroscope"}};var ee=l(52131),te=l.n(ee),B=l(25111),ae=l(58964),p=l(42844),m=l(66310);function L(t){const e=(0,m.wW)((0,o.useCallback)(a=>ne(a,t),[t]));return o.createElement("div",{className:e.root},t.children)}const ne=(t,e)=>({root:(0,p.css)({display:"flex",flexDirection:e.direction??"row",flexWrap:e.wrap??!0?"wrap":void 0,alignItems:e.alignItems,gap:t.spacing(e.gap??2),flexGrow:e.flexGrow})}),D=({children:t,stackProps:e})=>{const a=(0,m.wW)(oe);return o.createElement("div",{className:a.root},o.createElement(L,{gap:2,...e},t))},oe=t=>({root:(0,p.css)({padding:t.spacing(1),backgroundColor:t.colors.background.secondary,borderRadius:t.shape.borderRadius(1)})}),re=({children:t})=>o.createElement(L,{gap:.5,direction:"column"},t);var le=l(92024),se=l(11649);const ie={id:"phlareql",extensions:[".phlareql"],aliases:["phlare","phlareql"],mimetypes:[],def:{language:{ignoreCase:!1,defaultToken:"",tokenPostfix:".phlareql",keywords:[],operators:[],symbols:/[=><!~?:&|+\-*\/^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,integersuffix:/(ll|LL|u|U|l|L)?(ll|LL|u|U|l|L)?/,floatsuffix:/[fFlL]?/,tokenizer:{root:[[/[a-z_]\w*(?=\s*(=|!=|=~|!~))/,"tag"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d+/,"number"],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],clauses:[[/[^(,)]/,"tag"],[/\)/,"identifier","@pop"]],whitespace:[[/[ \t\r\n]+/,"white"]]}},languageConfiguration:{wordPattern:/(-?\d*\.\d\w*)|([^`~!#%^&*()\-=+\[{\]}\\|;:'",.<>\/?\s]+)/g,brackets:[["{","}"]],autoClosingPairs:[{open:"{",close:"}"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{}}}};class ce{constructor(){this.triggerCharacters=["{",",","[","(","=","~"," ",'"'],this.labels=[],this.getLabelValues=()=>Promise.resolve([])}init(e,a){this.labels=e,this.getLabelValues=a}provideCompletionItems(e,a){if(!(this.monaco&&this.editor))throw new Error("provideCompletionItems called before CompletionProvider was initialized");if(this.editor.getModel()?.id!==e.id)return{suggestions:[]};const{range:n,offset:r}=me(this.monaco,e,a),c=fe(e.getValue(),r);return this.getCompletions(c).then(s=>{const u=s.length.toString().length;return{suggestions:s.map((g,d)=>({kind:ue(g.type,this.monaco),label:g.label,insertText:g.insertText,sortText:d.toString().padStart(u,"0"),range:n}))}})}async getCompletions(e){switch(e.type){case"UNKNOWN":return[];case"EMPTY":return this.labels.map(n=>({label:n,insertText:`{${n}="`,type:"LABEL_NAME"}));case"IN_LABEL_NAME":return this.labels.map(n=>({label:n,insertText:n,type:"LABEL_NAME"}));case"IN_LABEL_VALUE":return(await this.getLabelValues(e.labelName)).map(n=>({label:n,insertText:e.betweenQuotes?n:`"${n}"`,type:"LABEL_VALUE"}));default:throw new Error(`Unexpected situation ${e}`)}}}function ue(t,e){switch(t){case"LABEL_NAME":return e.languages.CompletionItemKind.Enum;case"LABEL_VALUE":return e.languages.CompletionItemKind.EnumMember;default:throw new Error(`Unexpected CompletionType: ${t}`)}}const M=/[a-zA-Z_][a-zA-Z0-9_]*/,z=/[^"]*/,de=new RegExp(`(${M.source})="(${z.source})"`,"g"),pe=new RegExp(`(${M.source})=("?)${z.source}$`),ge=new RegExp(/[{,]\s*[a-zA-Z0-9_]*$/);function fe(t,e){if(t==="")return{type:"EMPTY"};const a=t.matchAll(de),n=Array.from(a).reduce((s,u)=>{const[i,g,d]=u[1];return s.push({name:g,value:d}),s},[]),r=t.substring(0,e).match(pe);return r?{type:"IN_LABEL_VALUE",labelName:r[1],betweenQuotes:!!r[2],otherLabels:n}:t.substring(0,e).match(ge)?{type:"IN_LABEL_NAME",otherLabels:n}:{type:"UNKNOWN"}}function me(t,e,a){const n=e.getWordAtPosition(a),r=n!=null?t.Range.lift({startLineNumber:a.lineNumber,endLineNumber:a.lineNumber,startColumn:n.startColumn,endColumn:n.endColumn}):t.Range.fromPositions(a),c={column:a.column,lineNumber:a.lineNumber};return{offset:e.getOffsetAt(c),range:r}}function ye(t){const e=be(t.getLabelValues,t.labels),a=(0,m.wW)(Ee),n=(0,le.Z)(t.onRunQuery),r=(0,o.useRef)(null);return o.createElement("div",{className:a.wrapper,ref:r},o.createElement(se.p,{value:t.value,language:y,onBlur:t.onChange,containerStyles:a.queryField,monacoOptions:{folding:!1,fontSize:14,lineNumbers:"off",overviewRulerLanes:0,renderLineHighlight:"none",scrollbar:{vertical:"hidden",verticalScrollbarSize:8,horizontal:"hidden",horizontalScrollbarSize:0},scrollBeyondLastLine:!1,wordWrap:"on",padding:{top:5,bottom:6}},onBeforeEditorMount:ve,onEditorDidMount:(c,s)=>{e(c,s);const u=()=>{const i=r.current;if(i!==null){const g=c.getContentHeight();i.style.height=`${g+he}px`,i.style.width="100%";const d=i.clientWidth;c.layout({width:d,height:g})}};c.onDidContentSizeChange(u),u(),c.addCommand(s.KeyMod.Shift|s.KeyCode.Enter,()=>{n.current(c.getValue())})}}))}const he=2;function be(t,e){const a=(0,o.useRef)();a.current===void 0&&(a.current=new ce),(0,B.Z)(async()=>{a.current&&a.current.init(e||[],t)},[e,t]);const n=(0,o.useRef)(null);return(0,o.useEffect)(()=>()=>{n.current?.()},[]),(r,c)=>{if(a.current){a.current.editor=r,a.current.monaco=c;const{dispose:s}=c.languages.registerCompletionItemProvider(y,a.current);n.current=s}}}let O=!1;const y="phlareql";function ve(t){if(O===!1){O=!0;const{aliases:e,extensions:a,mimetypes:n,def:r}=ie;t.languages.register({id:y,aliases:e,extensions:a,mimetypes:n}),t.languages.setMonarchTokensProvider(y,r.language),t.languages.setLanguageConfiguration(y,r.languageConfiguration)}}const Ee=()=>({queryField:(0,p.css)` flex: 1; // Not exactly sure but without this the editor does not shrink after resizing (so you can make it bigger but not // smaller). At the same time this does not actually make the editor 100px because it has flex 1 so I assume // this should sort of act as a flex-basis (but flex-basis does not work for this). So yeah CSS magic. width: 100px; `,wrapper:(0,p.css)` display: flex; flex: 1; border: 1px solid rgba(36, 41, 46, 0.3); border-radius: 2px; `});var xe=l(73195),Q=l(66670),W=l(73453),Se=l(40705),Le=l(28580),Te=l(1128),Ce=l(66258),Ne=l(80011),Ae=l(22209),Pe=l(80402);const T=t=>{const{label:e,optional:a,tooltip:n,children:r,width:c,...s}=t,u=(0,m.l4)(),i=Re(u,c),g=s?.htmlFor||Ce?.getChildId(r),d=o.createElement(o.Fragment,null,o.createElement("label",{className:i.label,htmlFor:g},e,a&&o.createElement("span",{className:i.optional}," - optional"),n&&o.createElement(Ne.u,{placement:"top",content:n,theme:"info"},o.createElement(W.J,{name:"info-circle",size:"sm",className:i.icon}))),o.createElement("span",{className:i.space}));return o.createElement("div",{className:i.root},o.createElement(Ae.g,{className:i.field,label:d,...s},r))},Re=(0,Pe.B)((t,e)=>({space:(0,p.css)({paddingRight:t.spacing(0),paddingBottom:t.spacing(.5)}),root:(0,p.css)({minWidth:t.spacing(e??0)}),label:(0,p.css)({fontSize:12,fontWeight:t.typography.fontWeightMedium}),optional:(0,p.css)({fontStyle:"italic",color:t.colors.text.secondary}),field:(0,p.css)({marginBottom:0}),icon:(0,p.css)({color:t.colors.text.secondary,marginLeft:t.spacing(1),":hover":{color:t.colors.text.primary}})})),V=[{value:"metrics",label:"Metric",description:"Return aggregated metrics"},{value:"profile",label:"Profile",description:"Return profile"},{value:"both",label:"Both",description:"Return both metric and profile data"}];function we(t){return t===A.zj.Explore?V:V.filter(e=>e.value!=="both")}function Ie({query:t,onQueryChange:e,app:a,labels:n}){const[r,c]=(0,xe.Z)(!1),s=(0,m.wW)(Fe),u=we(a),i=n?n.map(d=>({label:d,value:d})):[],g=(0,m.wW)(Q.gN);return o.createElement(L,{gap:0,direction:"column"},o.createElement(Q.zx,{className:(0,p.cx)(s.header,g),onClick:c,title:"Click to edit options"},o.createElement("div",{className:s.toggle},o.createElement(W.J,{name:r?"angle-down":"angle-right"})),o.createElement("h6",{className:s.title},"Options"),!r&&o.createElement("div",{className:s.description},[`Type: ${t.queryType}`,t.groupBy?.length?`Group by: ${t.groupBy.join(", ")}`:void 0].filter(d=>d).map((d,f)=>o.createElement("span",{key:f},d)))),r&&o.createElement("div",{className:s.body},o.createElement(T,{label:"Query Type"},o.createElement(Se.S,{options:u,value:t.queryType,onChange:d=>e({...t,queryType:d})})),o.createElement(T,{label:"Group by",tooltip:o.createElement(o.Fragment,null,"Used to group the metric result by a specific label or set of labels. Does not apply to profile query.")},o.createElement(Le.NU,{placeholder:"Label",value:t.groupBy,allowCustomValue:!0,options:i,onChange:d=>{const f=d.map(C=>C.value);e({...t,groupBy:f})}})),o.createElement(T,{label:"Max Nodes",tooltip:o.createElement(o.Fragment,null,"Sets the maximum number of nodes to return in the flamegraph.")},o.createElement(Te.I,{value:t.maxNodes||"",type:"number",placeholder:"16384",onChange:d=>{let f=parseInt(d.currentTarget.value,10);f=isNaN(f)?0:f,e({...t,maxNodes:f})}}))))}const Fe=t=>({switchLabel:(0,p.css)({color:t.colors.text.secondary,cursor:"pointer",fontSize:t.typography.bodySmall.fontSize,"&:hover":{color:t.colors.text.primary}}),header:(0,p.css)({display:"flex",cursor:"pointer",alignItems:"baseline",color:t.colors.text.primary,"&:hover":{background:t.colors.emphasize(t.colors.background.primary,.03)}}),title:(0,p.css)({flexGrow:1,overflow:"hidden",fontSize:t.typography.bodySmall.fontSize,fontWeight:t.typography.fontWeightMedium,margin:0}),description:(0,p.css)({color:t.colors.text.secondary,fontSize:t.typography.bodySmall.fontSize,paddingLeft:t.spacing(2),gap:t.spacing(2),display:"flex"}),body:(0,p.css)({display:"flex",paddingTop:t.spacing(2),gap:t.spacing(2),flexWrap:"wrap"}),toggle:(0,p.css)({color:t.colors.text.secondary,marginRight:`${t.spacing(1)}`})});function Be(t){const{onChange:e,onRunQuery:a,datasource:n,query:r,range:c,app:s}=t;function u(Ue){e({...r,labelSelector:Ue}),a()}const{profileTypes:i,onProfileTypeChange:g,selectedProfileName:d}=Qe(n,r,e),{labels:f,getLabelValues:C,onLabelSelectorChange:$e}=ze(c,n,r,e);De(r,i,e,s);const ke=Oe(i);return o.createElement(re,null,o.createElement(D,{stackProps:{wrap:!1,gap:1}},o.createElement(ae.O,{onChange:g,options:ke,buttonProps:{variant:"secondary"}},d),o.createElement(ye,{value:r.labelSelector,onChange:$e,onRunQuery:u,labels:f,getLabelValues:C})),o.createElement(D,null,o.createElement(Ie,{query:r,onQueryChange:t.onChange,app:t.app,labels:f})))}function De(t,e,a,n){(0,o.useEffect)(()=>{const r=I(t,n),c=t.profileTypeId&&e.find(s=>s.id===t.profileTypeId);e.length&&!c&&(r.profileTypeId=Me(e)),te()(t,r)||a(r)},[n,t,e,a])}function Me(t){const e=t.filter(a=>a.id.indexOf("cpu")>=0);if(e.length){const a=e.find(n=>n.id.indexOf("samples")===-1);return a?a.id:e[0].id}return t[0].id}function ze(t,e,a,n){const r={to:Math.ceil((t?.to.valueOf()||0)/5e3)*5e3,from:Math.floor((t?.from.valueOf()||0)/5e3)*5e3},c=(0,B.Z)(()=>e.getLabelNames(a.profileTypeId+a.labelSelector,r.from,r.to),[e,a.profileTypeId,a.labelSelector,r.to,r.from]),s=(0,o.useCallback)(i=>e.getLabelValues(a.profileTypeId+a.labelSelector,i,r.from,r.to),[a,e,r.to,r.from]),u=(0,o.useCallback)(i=>{n({...a,labelSelector:i})},[n,a]);return{labels:c.value,getLabelValues:s,onLabelSelectorChange:u}}function Oe(t){return(0,o.useMemo)(()=>{let e=new Map;for(let a of t){let n;if(a.id.indexOf(":")>-1)n=a.id.split(":");else{n=a.id.split(".");const s=n.pop();n=[n.join("."),s]}const[r,c]=n;e.has(r)||e.set(r,{label:r,value:a.id,children:[]}),e.get(r)?.children?.push({label:c,value:a.id})}return Array.from(e.values())},[t])}function Qe(t,e,a){const[n,r]=(0,o.useState)([]);(0,o.useEffect)(()=>{(async()=>{const u=await t.getProfileTypes();r(u)})()},[t]);const c=(0,o.useCallback)((u,i)=>{if(i.length===0)return;const g=i[i.length-1].value;a({...e,profileTypeId:g})},[a,e]),s=We(n,e.profileTypeId,t.backendType);return{profileTypes:n,onProfileTypeChange:c,selectedProfileName:s}}function We(t,e,a="phlare"){return(0,o.useMemo)(()=>{if(!t)return"Loading";const n=t.find(r=>r.id===e);return n?n.label:a==="pyroscope"?"Select application":"Select a profile type"},[e,t,a])}const Ve=new x.hf(R).setConfigEditor(_).setQueryEditor(Be)},92024:($,h,l)=>{l.d(h,{Z:()=>S});var x=l(27702),o=function(b){var v=(0,x.useRef)(b);return v.current=b,v};const S=o}}]); //# sourceMappingURL=pyroscopePlugin.c84aaed8a487cb0f026b.js.map