web-interface.assets.bb8c8232-5578.0300fa3f9aefe812c7bd.js Maven / Gradle / Ivy
(()=>{(self.webpackChunkgraylog_web_interface=self.webpackChunkgraylog_web_interface||[]).push([["bb8c8232-5578"],{"TsXT+bAI":(O,A,e)=>{"use strict";e.d(A,{A:()=>E});var t=e("pmX897Fv"),l=e.n(t),n=e("DjJvgDaP"),S=e.n(n),u=S()(l());u.push([O.id,`.xUMQPeRwYREG_QMMJHzD {
white-space: nowrap;
}`,"",{version:3,sources:["webpack://./src/components/sidecars/common/StatusIndicator.css"],names:[],mappings:"AAAA;IACI,mBAAmB;AACvB",sourcesContent:[`:local(.indicator) {
white-space: nowrap;
}`],sourceRoot:""}]),u.locals={indicator:"xUMQPeRwYREG_QMMJHzD"};const E=u},SfPIQIJE:(O,A,e)=>{"use strict";e.d(A,{A:()=>v});var t=e("Z7aTuO5B"),l=e("J6y4/h8P"),n=e("rIl5IEuP"),S=e("ty2gyrHp"),u=e("IOI9nV80"),E=e("NV1/EHMi");const i=(0,l.default)(n.ButtonToolbar)`
margin-bottom: 10px;
`,h=(0,l.default)(n.Button)(({theme:o})=>(0,l.css)`
font-family: ${o.fonts.family.navigation};
font-size: ${o.fonts.size.navigation};
color: ${o.colors.variant.darker.default};
&:hover,
&:focus {
background: inherit;
text-decoration: none;
}
&:hover {
color: inherit;
${(0,E.WS)(o)}
}
&.active {
color: ${o.colors.global.textDefault};
${(0,E.at)(o)}
&:hover,
&:focus {
${(0,E.at)(o)}
}
`);h.displayName="Button";const v=({items:o})=>t.createElement(i,null,o.map(({path:m,title:s,permissions:a,exactPathMatch:r})=>m?t.createElement(u.Wj,{permissions:a!=null?a:[],key:m},t.createElement(S.m,{to:m,relativeActive:!r},t.createElement(h,{bsStyle:"link"},t.createElement(E.Ay,null,s)))):null))},jlBzXt0Y:(O,A,e)=>{"use strict";e.d(A,{A:()=>v});var t=e("Z7aTuO5B"),l=e("ii0bleBb"),n=e.n(l),S=e("IOI9nV80"),u=e("rlwexfKi");const E=t.createElement(t.Fragment,null,t.createElement("p",null,"Find sidecars that did not communicate with Graylog since a date:",t.createElement("br",null),t.createElement("kbd",null,"last_seen:<=2018-04-10"),t.createElement("br",null)),t.createElement("p",null,"Find sidecars with ",t.createElement("code",null,"failing")," or ",t.createElement("code",null,"unknown")," status:",t.createElement("br",null),t.createElement("kbd",null,"status:failing status:unknown"),t.createElement("br",null))),i={status:"Status of the sidecar as it appears in the list, i.e. running, failing, or unknown",operating_system:"Operating system the sidecar is running on",last_seen:"Date and time when the sidecar last communicated with Graylog",node_id:"Identifier of the sidecar",sidecar_version:"Sidecar version"},h=t.createElement(u.A,{entityName:"sidecar",example:E,commonFields:["name"],fieldMap:i}),d=({query:o,onSearch:m,onReset:s,children:a})=>t.createElement(S.B9,{query:o,onSearch:m,onReset:s,placeholder:"Find sidecars",queryHelpComponent:h,topMargin:0,useLoadingState:!0},a);d.propTypes={query:n().string.isRequired,onSearch:n().func.isRequired,onReset:n().func.isRequired,children:n().element},d.defaultProps={children:void 0};const v=d},tBcsAR17:(O,A,e)=>{"use strict";e.d(A,{A:()=>i});var t=e("Z7aTuO5B"),l=e("SfPIQIJE"),n=e("d4kzUuQm"),S=e("rIl5IEuP");const u=[{title:"Overview",path:n.Ay.SYSTEM.SIDECARS.OVERVIEW,exactPathMatch:!0},{title:"Administration",path:n.Ay.SYSTEM.SIDECARS.ADMINISTRATION},{title:"Configuration",path:n.Ay.SYSTEM.SIDECARS.CONFIGURATION},{title:"Failure Tracking",path:n.Ay.SYSTEM.SIDECARS.FAILURE_TRACKING}],i=()=>t.createElement(S.Row,null,t.createElement(l.A,{items:u}))},"nP+JCm88":(O,A,e)=>{"use strict";e.d(A,{A:()=>w});var t=e("Z7aTuO5B"),l=e("ii0bleBb"),n=e.n(l),S=e("Dg7SLLbb"),u=e.n(S),E=e("IOI9nV80"),i=e("Y7XN0VBN"),h=e("IZYxBTgT"),d=e("O/XpfGnR"),v=e("dFpwyWHg"),o=e.n(v),m=e("C2ikvoS0"),s=e.n(m),a=e("1IntWRSu"),r=e.n(a),g=e("8nGWeFnd"),p=e.n(g),y=e("TeAcaicX"),H=e.n(y),f=e("eE3+5goe"),Z=e.n(f),G=e("TsXT+bAI"),L={};L.styleTagTransform=Z(),L.setAttributes=p(),L.insert=r().bind(null,"head"),L.domAPI=s(),L.insertStyleElement=H();var j=o()(G.A,L);const Y=G.A&&G.A.locals?G.A.locals:void 0,V=({message:k,status:Q,lastSeen:J,id:q})=>{const{toUserTimezone:b}=(0,d.A)();let B=k;const W=u()(i.A.toString(Q)),ee=b(J);let F,$;switch(Q){case i.A.RUNNING:$="text-success",F="play_arrow";break;case i.A.FAILING:$="text-danger",F="warning";break;case i.A.STOPPED:$="text-danger",F="error";break;default:$="text-info",F="help",B+=` (${(0,h._$)(ee)})`}return B&&q?t.createElement(E.N,{placement:"top",overlay:B,rootClose:!0,trigger:"hover"},t.createElement("span",{className:`${$} ${Y.indicator}`},t.createElement(E.In,{name:F})," ",W)):t.createElement("span",{className:`${$} ${Y.indicator}`},t.createElement(E.In,{name:F})," ",W)};V.propTypes={id:n().string,lastSeen:n().string,message:n().string,status:n().number},V.defaultProps={id:"",lastSeen:void 0,message:"",status:-1};const w=V},GIeTfzK9:(O,A,e)=>{"use strict";e.d(A,{A:()=>d});var t=e("ii0bleBb"),l=e.n(t),n=e("Z7aTuO5B"),S=e("J6y4/h8P"),u=e("rIl5IEuP"),E=e("gqVHlIxA");const i=S.default.div`
word-break: break-all;
overflow-wrap: break-word;
white-space: pre-wrap;
max-height: 500px;
`,h=({showModal:v,onHide:o,collectorName:m,collectorVerbose:s})=>n.createElement(E.A,{showModal:v,onHide:o,bsSize:"large"},n.createElement(u.Modal.Header,{closeButton:!0},n.createElement(u.Modal.Title,null,n.createElement("span",null,"Error Details for ",n.createElement("em",null,m)))),n.createElement(u.Modal.Body,null,n.createElement("pre",null,n.createElement(i,null,s||""))),n.createElement(u.Modal.Footer,null,n.createElement(u.Button,{type:"button",onClick:o},"Close")));h.propTypes={showModal:l().bool.isRequired,onHide:l().func.isRequired,collectorName:l().string.isRequired,collectorVerbose:l().string.isRequired};const d=h},Y7XN0VBN:(O,A,e)=>{"use strict";e.d(A,{A:()=>E});var t=e("PH5VRLCQ"),l=e.n(t),n=e("ueJll2OF"),S=e.n(n);const E={RUNNING:0,UNKNOWN:1,FAILING:2,STOPPED:3,properties:{0:{name:"running"},1:{name:"unknown"},2:{name:"failing"},3:{name:"stopped"}},isValidStatusCode(i){return Object.keys(this.properties).includes(String(i))},toStatusCode(i){const h=l()(i);return h===this.properties[this.RUNNING].name?this.RUNNING:h===this.properties[this.FAILING].name?this.FAILING:h===this.properties[this.STOPPED].name?this.STOPPED:this.UNKNOWN},toString(i){switch(S()(i)){case this.RUNNING:return"running";case this.FAILING:return"failing";case this.STOPPED:return"stopped";default:return"unknown"}}}},"2bMZsp0q":(O,A,e)=>{"use strict";e.r(A),e.d(A,{default:()=>te});var t=e("Z7aTuO5B"),l=e("rIl5IEuP"),n=e("IOI9nV80"),S=e("E+CaPsQD"),u=e("tBcsAR17"),E=e("r6oYOZXJ"),i=e("rVdVsuGH"),h=e("kHvj/lAD"),d=e("ii0bleBb"),v=e.n(d),o=e("J6y4/h8P"),m=e("jlBzXt0Y"),s=e("ty2gyrHp"),a=e("4IfE3Ihm"),r=e("d4kzUuQm"),g=e("nP+JCm88");const p=o.default.div`
height: 80px;
overflow: hidden scroll;
white-space: pre-wrap;
margin-bottom: 6px;
`,y=o.default.div`
color: #94979c;
font-style: italic;
font-size: 66%;
`,H=(0,o.default)(l.Button)`
padding-left: 0;
`,f=({sidecar:C,collectors:P,onShowDetails:D})=>{const c=C.active?"":" (inactive)",{node_id:I=null,node_name:_,last_seen:N,node_details:{status:{message:R=null,status:X=void 0,collectors:z}={}}={}}=C,x=T=>P.find(M=>M.id===T);return t.createElement(t.Fragment,null,z==null?void 0:z.filter(T=>T.status===2).map(T=>{const M=x(T.collector_id);return t.createElement("tr",{key:T.collector_id+T.configuration_id},t.createElement("td",null,t.createElement(s.N,{to:r.Ay.SYSTEM.SIDECARS.STATUS(C.node_id)},_),t.createElement(y,null,c),t.createElement(y,null,M==null?void 0:M.node_operating_system),t.createElement(y,null,"v",C.sidecar_version),t.createElement(y,null,C.node_id)),t.createElement("td",null,M==null?void 0:M.name),t.createElement("td",null,t.createElement(a.A,{dateTime:N})),t.createElement("td",null,t.createElement(g.A,{status:X,message:R,id:I,lastSeen:N})),t.createElement("td",null,T.message),t.createElement("td",null,t.createElement(p,null,T.verbose_message),t.createElement(H,{bsStyle:"link",bsSize:"xs",onClick:()=>D({name:M==null?void 0:M.name,verbose_message:T.verbose_message})},"Show more")))}))};f.propTypes={sidecar:v().object.isRequired};const Z=f;var G=e("GIeTfzK9");const L=(0,o.default)(n.yc)`
&& {
width: 12px;
margin-left: 5px;
line-height: 1;
}
`,j=o.default.col`
width: 9%;
`,Y=o.default.col`
width: 14%;
`,V=o.default.col`
width: 50%;
`,w=({onlyActive:C,query:P})=>{const D=C&&' and/or click on "Include inactive sidecars"';return t.createElement(n.EO,null,`There are no sidecars with failures matching the search criteria. Try adjusting your search filter: ${P} ${D}`)},k=({rows:C,sort:P,onSortChange:D})=>{const c={node_name:"Sidecar",collector:"Collector",last_seen:"Last Seen","node_details.status.status":"Status",message:"Error Message",verbose_message:"Verbose Message"},I=["node_name","last_seen"];return t.createElement(l.Table,{striped:!0,responsive:!0},t.createElement("colgroup",null,t.createElement(j,null),t.createElement(j,null),t.createElement(j,null),t.createElement(j,null),t.createElement(Y,null),t.createElement(V,null)),t.createElement("thead",null,t.createElement("tr",null,Object.keys(c).map(_=>t.createElement("th",{key:_},c[_],I.includes(_)&&t.createElement(L,{activeDirection:P.field===_?P.order:null,onChange:()=>D(_),title:_,ascId:"asc",descId:"desc"}))))),t.createElement("tbody",null,C))},Q=({query:C,onlyActive:P})=>C?t.createElement(w,{onlyActive:P,query:C}):t.createElement(n.WE,null,"There are no sidecars with failures."),J=({sidecars:C,collectors:P,pagination:D,query:c,sort:I,onlyActive:_,onPageChange:N,onQueryChange:R,onSortChange:X,toggleShowInactive:z})=>{const[x,T]=(0,t.useState)(null),M=C.map(K=>t.createElement(Z,{key:K.node_id,sidecar:K,collectors:P,onShowDetails:T})),U=_?"Include":"Hide";return t.createElement("div",null,t.createElement("div",null,t.createElement(m.A,{query:c,onSearch:R,onReset:R},t.createElement(l.Button,{bsStyle:"primary",onClick:z},U," inactive sidecars"))),t.createElement(n.OW,{showPageSizeSelect:!1,totalItems:D.total,onChange:N},t.createElement(l.Row,null,t.createElement(l.Col,{md:12},M.length>0?t.createElement(k,{rows:M,sort:I,onSortChange:X}):t.createElement(Q,{query:c,onlyActive:_})))),x&&t.createElement(G.A,{showModal:!0,onHide:()=>T(null),collectorName:x.name,collectorVerbose:x.verbose_message}))};J.propTypes={sidecars:v().array.isRequired,collectors:v().array.isRequired,pagination:v().object.isRequired,query:v().string.isRequired,sort:v().object.isRequired,onlyActive:v().bool.isRequired,onPageChange:v().func.isRequired,onQueryChange:v().func.isRequired,onSortChange:v().func.isRequired,toggleShowInactive:v().func.isRequired};const q=J,b=[25],B={page:1,pageSize:b[0],query:"",sortField:"last_seen",order:"desc",onlyActive:!1},W=(C,P)=>{const{page:D=B.page,pageSize:c=B.pageSize,query:I=B.query,sortField:_=B.sortField,order:N=B.order,onlyActive:R=B.onlyActive}=C;return E.U.listPaginated({page:D,pageSize:c,query:I,sortField:_,order:N,onlyActive:R}).then(P)},F=()=>{const{page:C,pageSize:P,resetPage:D}=(0,i.Ay)(b),[c,I]=(0,t.useState)(null),[_,N]=(0,t.useState)([]);(0,t.useEffect)(()=>{if((c==null?void 0:c.pagination.page)!==C||(c==null?void 0:c.pagination.per_page)!==P){const{query:U,sort:K,order:oe,only_active:se}=c||{};W({query:U,page:C,pageSize:P,order:oe,sortField:K,onlyActive:se},I)}},[C,P,c]),(0,t.useEffect)(()=>{h.C.all().then(U=>N(U.collectors))},[]);const R={page:1,pageSize:P,query:c==null?void 0:c.query,sortField:c==null?void 0:c.sort,order:c==null?void 0:c.order,onlyActive:c==null?void 0:c.only_active},X=(U,K)=>{W({...R,page:U,pageSize:K},I)},z=(U="",K=()=>{})=>{W({...R,query:U},I).then(D).finally(K)},x=U=>{W({...R,sortField:U,order:c.order==="asc"?"desc":"asc"},I).then(D)},T=()=>{W({...R,onlyActive:!c.only_active},I).then(D)};return c?t.createElement(q,{sidecars:c.sidecars,collectors:_,pagination:c.pagination,query:c.query,onlyActive:c.only_active,sort:{field:c.sort,order:c.order},onPageChange:X,onQueryChange:z,onSortChange:x,toggleShowInactive:T}):t.createElement(n.y$,null)},te=()=>t.createElement(n.Qc,{title:"Sidecars"},t.createElement(u.A,null),t.createElement(n.zY,{title:"Failure Tracking",documentationLink:{title:"Sidecar documentation",path:S.A.PAGES.COLLECTOR_SIDECAR}},t.createElement("span",null,"The Graylog Sidecar Failure Tracking provides additional useful information about failure reasons, that can help you decrease troubleshooting time and get your collectors back online faster.")),t.createElement(l.Row,{className:"content"},t.createElement(l.Col,{md:12},t.createElement(F,null))))},"kHvj/lAD":(O,A,e)=>{"use strict";e.d(A,{C:()=>o,k:()=>m});var t=e("JnTtTRmZ"),l=e.n(t),n=e("oCSEoDew"),S=e.n(n),u=e("wXrUUKFq"),E=e.n(u),i=e("MdYBRjRJ"),h=e("eFxcQyPT"),d=e("jAGDuYSC"),v=e("IA3Ku5lS");const o=(0,v.rN)("core.Collectors",()=>l().createActions({getCollector:{asyncResult:!0},all:{asyncResult:!0},list:{asyncResult:!0},create:{asyncResult:!0},update:{asyncResult:!0},delete:{asyncResult:!0},copy:{asyncResult:!0},validate:{asyncResult:!0}})),m=(0,v.Bv)("core.Collectors",()=>l().createStore({listenables:[o],sourceUrl:"/sidecar",collectors:void 0,query:void 0,pagination:{page:void 0,pageSize:void 0,total:void 0},total:void 0,paginatedCollectors:void 0,getInitialState(){return{collectors:this.collectors}},propagateChanges(){this.trigger({collectors:this.collectors,paginatedCollectors:this.paginatedCollectors,query:this.query,total:this.total,pagination:this.pagination})},getCollector(s){const a=(0,h.Ay)("GET",i.H3(`${this.sourceUrl}/collectors/${s}`));a.catch(r=>{let g=`Fetching Collector failed with status: ${r}`;r.status===404&&(g=`Unable to find a collector with ID <${s}>, please ensure it was not deleted.`),d.A.error(g,"Could not retrieve Collector")}),o.getCollector.promise(a)},_fetchCollectors({query:s,page:a,pageSize:r}){const g={query:s,page:a,per_page:r},p=S()(`${this.sourceUrl}/collectors/summary`).search(g).toString();return(0,h.Ay)("GET",i.H3(p))},all(){const s=this._fetchCollectors({pageSize:0});s.then(a=>(this.collectors=a.collectors,this.propagateChanges(),a.collectors),a=>{d.A.error(`Fetching collectors failed with status: ${a}`,"Could not retrieve collectors")}),o.all.promise(s)},list({query:s="",page:a=1,pageSize:r=10}){const g=this._fetchCollectors({query:s,page:a,pageSize:r});g.then(p=>(this.query=p.query,this.pagination={page:p.pagination.page,pageSize:p.pagination.per_page,total:p.pagination.total},this.total=p.total,this.paginatedCollectors=p.collectors,this.propagateChanges(),p.collectors),p=>{d.A.error(`Fetching collectors failed with status: ${p}`,"Could not retrieve collectors")}),o.list.promise(g)},refreshList(){this.list({query:this.query,page:this.pagination.page,pageSize:this.pagination.pageSize})},create(s){const a=(0,h.Ay)("POST",i.H3(`${this.sourceUrl}/collectors`),s);a.then(r=>(d.A.success("","Collector successfully created"),this.collectors=r.collectors,this.propagateChanges(),this.collectors),r=>{d.A.error(`Fetching collectors failed with status: ${r}`,"Could not retrieve collectors")}),o.create.promise(a)},update(s){const a=(0,h.Ay)("PUT",i.H3(`${this.sourceUrl}/collectors/${s.id}`),s);a.then(r=>(d.A.success("","Collector successfully updated"),this.collectors=r.collectors,this.propagateChanges(),this.collectors),r=>{d.A.error(`Fetching collectors failed with status: ${r}`,"Could not retrieve collectors")}),o.update.promise(a)},delete(s){const a=i.H3(`${this.sourceUrl}/collectors/${s.id}`),r=(0,h.Ay)("DELETE",a);r.then(g=>(d.A.success("",`Collector "${s.name}" successfully deleted`),this.refreshList(),g),g=>{d.A.error(`Deleting Collector failed: ${g.status===400?g.responseMessage:g.message}`,`Could not delete Collector "${s.name}"`)}),o.delete.promise(r)},copy(s,a){const r=i.H3(`${this.sourceUrl}/collectors/${s}/${a}`),p=(0,h.Ay)("POST",r);p.then(y=>(d.A.success("",`Collector "${a}" successfully copied`),this.refreshList(),y),y=>{d.A.error(`Saving collector "${a}" failed with status: ${y.message}`,"Could not save Collector")}),o.copy.promise(p)},validate(s){const a={id:" ",service_type:"exec",executable_path:" ",default_template:" "};E()(a,s);const r=(0,h.Ay)("POST",i.H3(`${this.sourceUrl}/collectors/validate`),a);r.then(g=>g,g=>d.A.error(`Validating collector "${a.name}" failed with status: ${g.message}`,"Could not validate collector")),o.validate.promise(r)}}))},r6oYOZXJ:(O,A,e)=>{"use strict";e.d(A,{U:()=>d,W:()=>v});var t=e("JnTtTRmZ"),l=e.n(t),n=e("oCSEoDew"),S=e.n(n),u=e("MdYBRjRJ"),E=e("jAGDuYSC"),i=e("eFxcQyPT"),h=e("IA3Ku5lS");const d=(0,h.rN)("core.Sidecars",()=>l().createActions({listPaginated:{asyncResult:!0},getSidecar:{asyncResult:!0},getSidecarActions:{asyncResult:!0},restartCollector:{asyncResult:!0},assignConfigurations:{asyncResult:!0}})),v=(0,h.Bv)("core.Sidecars",()=>l().createStore({listenables:[d],sourceUrl:"/sidecars",sidecars:void 0,onlyActive:void 0,pagination:{count:void 0,page:void 0,pageSize:void 0,total:void 0},query:void 0,sort:{field:void 0,order:void 0},init(){this.propagateChanges()},propagateChanges(){this.trigger({sidecars:this.sidecars,query:this.query,onlyActive:this.onlyActive,pagination:this.pagination,sort:this.sort})},listPaginated({query:o="",page:m=1,pageSize:s=50,onlyActive:a=!1,sortField:r="node_name",order:g="asc"}){const p={query:o,page:m,per_page:s,only_active:a,sort:r,order:g},y=S()(this.sourceUrl).search(p).toString(),H=(0,i.Ur)("GET",u.H3(y));H.then(f=>(this.sidecars=f.sidecars,this.query=f.query,this.onlyActive=f.only_active,this.pagination={total:f.pagination.total,count:f.pagination.count,page:f.pagination.page,pageSize:f.pagination.per_page},this.sort={field:f.sort,order:f.order},this.propagateChanges(),f),f=>{E.A.error(f.status===400?f.responseMessage:`Fetching Sidecars failed with status: ${f.message}`,"Could not retrieve Sidecars")}),d.listPaginated.promise(H)},getSidecar(o){const m=(0,i.Ur)("GET",u.H3(`${this.sourceUrl}/${o}`));m.catch(s=>{let a=`Fetching Sidecar failed with status: ${s}`;s.status===404&&(a=`Unable to find a sidecar with ID <${o}>, maybe it was inactive for too long.`),E.A.error(a,"Could not retrieve Sidecar")}),d.getSidecar.promise(m)},restartCollector(o,m){const s={};s.collector=m,s.properties={},s.properties.restart=!0;const a=(0,i.Ay)("PUT",u.H3(`${this.sourceUrl}/${o}/action`),[s]);a.catch(r=>{E.A.error(`Restarting Sidecar failed with status: ${r}`,"Could not restart Sidecar")}),d.restartCollector.promise(a)},getSidecarActions(o){const m=(0,i.Ur)("GET",u.H3(`${this.sourceUrl}/${o}/action`));m.catch(s=>{E.A.error(`Fetching Sidecar actions failed with status: ${s}`,"Could not retrieve Sidecar actions")}),d.getSidecarActions.promise(m)},toConfigurationAssignmentDto(o,m,s){return{node_id:o,collector_id:m,configuration_id:s}},assignConfigurations(o,m){const s=o.map(({sidecar:r,collector:g})=>{const p=r.assignments.filter(y=>y.collector_id!==g.id);return m.forEach(y=>{p.push({collector_id:g.id,configuration_id:y.id})}),{node_id:r.node_id,assignments:p}}),a=(0,i.Ay)("PUT",u.H3(`${this.sourceUrl}/configurations`),{nodes:s});a.then(r=>(E.A.success("",`Configuration change for ${o.length} collectors requested`),r),r=>{E.A.error(`Fetching Sidecar actions failed with status: ${r}`,"Could not retrieve Sidecar actions")}),d.assignConfigurations.promise(a)}}))},PH5VRLCQ:(O,A,e)=>{var t=e("R+B8SaP1"),l=t(function(n,S,u){return n+(u?" ":"")+S.toLowerCase()});O.exports=l}}]);})();
//# sourceMappingURL=bb8c8232-5578.0300fa3f9aefe812c7bd.js.map
© 2015 - 2024 Weber Informatics LLC | Privacy Policy