 Probably because they're embarrassed about going or I don't know. Hey, good morning. So we're live now Or good afternoon. Yeah, good morning everyone if you're watching this in the US and Good later in the day if you're watching this in a Mia so today Jeremy and I are going to talk a little bit about a Microfile open telemetry Some things like that, but first we'd like to you know understand What is micro profile and why are we even talking about it in the first place? So Q Jeremy and the the one the one slide that we have today the rest will be code We have two slides. Oh, we do All right, can you guys see that? Yeah All right. Yeah, go to the next one that actually has some meaning. Yeah All right, so What is micro profile? You know, why is it? Important so for those of us that grew up in the Java EE space We had a bunch of extra functionality that we wanted to look at and micro profile has a long history it came along You know just a actually a few years back, but I'm playing with my my screen here so micro profiles started off way back I think in 2017 and We added a bunch of things like config to it We added some things that we needed that we were importing from other libraries like Netflix OSS Zipkin and other things We wanted some telemetry some configuration based stuff. So as Microfile grew up through like 2018 2019 You know, we Examine that with you know adding capabilities for like JSON B and other Stuff and then we decided to bring all that together and then there was going to be some standalone things like LRA and graph QL So with this functionality we can pretty much allow us to annotate our code pretty quickly for things like fault tolerance and capturing metrics with Prometheus or Doing a tracing with and capturing it through a Jaeger and then as the standards like open tracing and open consensus kind of combined then we created open telemetry and Combined that all but it's still backward compatible. So if I'm in an environment like JBoss EAP I Can leverage open telemetry with my existing code But I can also use that same standard and same coding skills if I'm in corpus, right? So we can pretty much very easily add some extensions to our code and Then grab a bunch of functionality and that's what we're going to talk about today and why Why we would want to do that? So what's the other slide Jeremy? It's our next slide. Oh, thank you. Okay So yeah We can forget about slides now. Um, so yeah, we're gonna look at a few different things. Um, I've got an application running So built a little application here So has anybody else seen or so I saw a mission impossible Tuesday night My daughter is a huge mission mission impossible fan and So we went to the movie Tuesday night in case anybody else has not seen it I guess it officially opens like tomorrow, I think So anyway, if you're if you're a fan of the mission impossible movies Built a little mission impossible app. So look close to 88. We're now running and we can get we have an API here we can get a list of all the mission impossible movies I've got postman running here, too. So we can see this in post postman as well We can get all the mission impossible movies. We can get a random mission impossible movies So we can say random mission impossible movie Dead reckoning part one. So that's the one I saw this week. It's pretty good. Um, and like You know being in technology if you ever see movies where people like hack into things or we have Computers as the bad guys Sometimes it gets a little goofy, but this one's pretty enjoyable. So we can do that. We can check out another one Whoops dictation So mission possible three again, we're just getting a random movie here In addition to movies we have IMF agents, right? So The those are the IM that we're missing a particular IMF agent here, right? But we have some of the supporting IMF agents here. We get a random IMF agent So they get a random IMF agent We got an error there. Hmm. I Have to address that in a minute And we've got some quotes from the movie. So we get some of the best Quotes so if I let you know where I'm going, I won't be on holiday, right? I would have thought the hardest part was serving that pressing need of yours to get your gun off Just stay alive. I'm not gonna lose you so you got some of the best quotes mission accomplished That's a good one, right? So we've got this this application here got some post again We have you know postman We get we can exercise this to post mail we can use it through our browser And so we will go through here and add in some stuff So what's the first thing we want to look at? So why don't real quick before we do that There's some tenants to the micro profile stuff, you know court tenants that The community has established like, you know, it's open source vendor neutral You know community engagement and collaboration, but from our perspective we're adding You know the working group has some additional core tenants like limited processes. So Allowing us to experiment and innovate You know doing an implementation first kind of thing And a low barrier to entry so Taking those things in mind as core tenants to actually use in micro profile Maybe Jeremy, let's add some tracing first and open telemetry Sure. Oh, and then one thing you'll notice you'll see this word small rye So small rye is a community project, right? Or so it's an umbrella project for some other projects that feed into park us including all of the micro profile stuff So you see config Java web token health fault tolerance Metrics we're gonna look at a few of these things Open tracing has been deprecated in favor of open telemetry, right? So a lot of the small rye is kind of the Umbrella project we'll use. So let's come over here. Let's stop that, right? Now of course, I'm running part of the park of CLI. And so what I'm gonna say is park is extension add And what am I gonna add first? You're gonna add open telemetry? Because that's the first one we we're gonna do now Taking those tenants that a core tenants that I just spoke about like limited processes being able to experiment and innovate really quickly And a low barrier to entry that's the only thing we did so far was Simply add open telemetry through adding an extension in that command line that he just did simply adds that to our Palm file and I am gonna do one kind of cheat here. So I Am going to I've already got the comments that the configuration that I need sitting in this application And I'm just gonna uncomment them now. So what I'm doing is I'm giving this a name so we can say You want to Expand your text a little bit. There you go. Yeah, so I'm gonna give this a name here the mission observability service So and then the endpoint for exporting traces and then just All right. So and then by the way, I'm also running Docker compose over here This is just my Docker compose machine. You want to see what I've got running. I've got this Mission observability and I'm running Prometheus and Jager. So those are both running waiting to start collecting metrics All right, so let's start corgis back up and so we're booting up. We're running dev Dev services of corgis and Dev services, right? It notices that I'm running Docker. It spins up all the containers I need it's created our database, right? So it's created the database stuff And then it's got install features and one of them is open telemetry right there So we've got open telemetry running. So let's see what we want to do first with open telemetry Go to Yeager here. Whoops and let's so we eager has already discovered our mission observability service, right and The only URL I found is the corgis dev UI if you haven't seen the corgis dev UI before by the way I'm the dev UI Is here and so the dev UI shows us all the stuff that we've got going database is hybrid ORM all very stuff we have right including open telemetry, right? So we're using open telemetry to trace the services So Yeager's already found There's your Yeager's already found that one. Well, let's come and do some stuff here Let's say get some random quotes here by fire. That's the best way really desperate times desperate measures Now, let's see if we Have an operation. We do have an operation now, right? Quotes random, so let's find some traces for that, right? So first of all, what's a job? What's a trace? What am I looking at here? All right? So if we're looking at a trace in a span What we're looking at is We made the call and we want to look at the timing of the call You'll notice that we didn't actually add anything to the code yet So simply adding the open telemetry and having the Yeager Collector up and running allows us to collect These traces and spans So we're gonna get some timing from that we're gonna get, you know, the endpoint that got called from that We're gonna get the status codes that got called from that, you know, whether it was successful or not We're gonna build on this so that we can understand the business process flow through this so Some things that might be relevant, you know, when you want to use this First and foremost, if you use this in production, there's gonna be a performance impact All right, so there's the ability for us to create Collectors that we can put into our own collectors So we could create a collector that is a sidecar and have it turned off in Production and then turn it on when there's a problem or we can do just turn tracing on say Jeremy was the last person to code anything on this and we have a new developer that comes on and Jeremy didn't document anything But if we had tracing in here turned on and that that capability then I could say to the new developer go through the code and hit some of the business process endpoints and observe All the components that are involved in that so one of the things that we're gonna observe We're gonna add the capability to look at the database Let's go back to that. Yeah So let's come back to Here we're gonna enable There you go for the tree And so you'll notice we haven't really done much so far except added the extension Yeah, gotta restart We added the extension and Then we just enabled a couple properties so far so we haven't added anything really to our code yet Yeah And of course, um You know certain things don't work when you're you're doing the demo Yeah, you got to add to open telemetry dash jdbc Dash jdbc Are you smelling telemetry? Let me cheat Yeah open the pop file Oh, this is why okay Not this is not actually a progress extension that we're adding. It's just an open telemetry. Yeah, there you go So that's why it is not adding so All right got that When we talk about telemetry too, let's uh, let's put it in perspective of open telemetry so that we can Understand what you know, we're talking about from an industry perspective Open telemetry is what we're using as a definition and when we talk about open telemetry really We're trying to define working with traces Metrics and locks right so those are the things we're really going to talk about uh relevant to micro profile and open telemetry today So now this time if you notice we have three spans, right? So our previous version I was calling random quotes, which I still got the quotes in the database, right? Yeah, the quotes we just had one span because it was just using our get right now I've got Movies random find the traces for that. We got three spans here. So let's see Our three spans we have our overall span, right? And then we have a data source get connection And then we have the select so we can drill in and see How long it takes us to get our connection, right? Not right? And we can see how long it takes to run the select And we even which is really nice. We even get the database uh statement, right? So we can see what we're selecting So this is really great. But what if I wanted to name? Something so I could actually trace it by name and then I could search on it By name. So I know this is all going into a Yeager collector But if I wanted to push this into something else where I was collecting that information and I wanted to trace it by name We could go to our code and we can add something uh a simple annotation uh with span IntelliJ to reload the palm file There we go value value equals I know just put a put it in brick quotes. No value equals There you go random say movies random movies random random movie span. We got a name there cool so now if I'm This is going uh getting published to some other collector And we wanted to correlate um this with say some metrics Or some logs that we're going to look at later I could now do some correlation uh in the background that said Um with the random movie span i'm seeing some timing things And I want to uh collect maybe some metrics and maybe there's some logs that are associated with this All right, so that takes us through basic spans to recap really quickly What we did here was added into our palm. I used the cli. You can also do this Um, you know manually you can do it when you generate your application Clark is open telemetry and then we had to manually add one extra one Which is just this open telemetry jdbc library, right? And so that gives us the ability to trace our calls We didn't have to do anything to start getting um data But we had this with span here and now we can get the name All right, so what do we want to do what do we want to look at next that gives us some basic insight What about actually taking care of our application like some maybe some small right stuff? Yeah, let's uh Let's add um You know some small right health So when our when our our application starts up we want to get out of the way. Is it is it alive? Is it um Is it um running? So that we would want to do also if we're going to deploy this into kubernetes eventually will not just uh Container we want to be able to hook into the um The kubernetes, you know, is it alive liveliness checks and readiness checks? All right, small right health has been installed So if we've got our prom we should find there we go right below what we were looking at previously We have small right health has been added to our prom file Right, so what do we want to do first now? Actually we we just started up. We'll get some value, right? mm-hmm Food up cork is here and this url that we didn't have going a minute ago We've already got one health check. We got two health checks, right? Yep. Just by adding Just by adding the extension we got um the capability to say, you know, is it up and running? So this is this is pretty neat because we didn't really have to do anything. It's really simple. Um Corkus did a lot of the work for us And micro profile the implementation of micro profile behind that Yeah, and it's really nice that it did about this is it knows we have a database and a data source and so it's already checked that, right? Mm-hmm, which is really nice And the help you I help you I database up database help But now that it now that we know it's uh, you know Up or down we can actually put some logic in there about whether or not it's up or down Based on something that is going on in the background and we can also add a liveliness check too, right general It will do liveness. Sure What do you want to call this our app? Let's call it application line. I think more sense, right? so the difference between liveliness and You know the difference between liveliness and readiness is simply, you know When they're in a container and if we were in say kubernetes If we were feeling a liveliness check We might have it restart the container whereas if we were feeling like a readiness check We'd probably stop the application from serving up any any traffic at all We need to implement health check, right? And we're going to say so we're going to return a health check response So I'll say our liveliness check right now is going to turn health check down. So it's uh Application down right so that one's not good Um and if we want to see this we can say Application down so I have a check that says application down not break it So what I want to do here and this is an application scope cdiv So let's put in some things in here like we would expect We can also let's say we can inject. I'm using the repository pattern for all this so I can say movie repository Can inject what do we have we have a quote repository? Um Can uh, what's the other one I have I have IMF agents, right? IMF agent in in fact, um, this is not the international monetary fund if you are not a uh A mission impossible fan the IMF in this case refers to the impossible Mission force which is our our heroes employer Um, okay, and then what I want to do here is I want to verify that I'll actually make a call. So I'll say if and let's say Movie repository list all and this is hibernate panache. I think we've covered this before but if you haven't seen hibernate panache super super nice Um, the repository pattern. Let me just pop it here really quickly repository pattern um implements a panache repository for the entity if you want to see the entity movie This is just our in our movie entity and I get all these kind of All this kind of stuff for free and then I've added in a random movie method myself But I'm just going to use list all which is just one of tons of methods I get for free So I'll say list all or actually I think I can do count. Yeah, I can do count of the anyway list all size greater than or equal to one And quote repository list all Size greater than or equal to one. This isn't like the cleanest looking code, right? But um Jeremy likes the whole domain driven design thing. So he does the repository pattern. I'm pretty simple So I do the active record thing If these are I'm this is pretty basic, right? But basically if I have stuff in my database and it's returning I'm going to say turn health check response up Yeah, maybe you want to make the code a little bigger. Somebody's uh having a little difficulty seeing the code Okay, how's that great Should we turn my our phases off for this or do you guys like you have to look at us too? Um, I'll turn my off. So I'll show you so what we what we have here is um I this apple I have this class called application liveness I've annotated it with this liveness pro, which is paleon quarkus. This is a liveness probe We're going to use this as part of health checks its application scope meaning it's a cdi bean I have all access to all the cdi bean stuff that I normally would Which is how I'm throwing a logger in here And I'm injecting other resources I'm injecting my repositories and I'll go I'll jump back into here in case you didn't see this so This movie repository. This is the repository pattern It's a panache repository. You haven't seen hibernate panache before it's super super cool makes things makes life really really nice This is a panache entity, which is you just extend panache entity you get a lot of stuff for free With panache So I've added a method called random movie But there's all kinds of methods that come for free one of those methods that come for free is to list all So I'm calling list all it's going to get all the movies out of the database um, I mentioned this is uh A man this bean is managed by quarkus, right? It is a cdi bean so I can also do things like saying transactional Which means I can talk to the database So that should be running right now. Let's see. I know all looks pretty good Um, so actually just saying reporting his health status application down, right? Because I reported down while I was initially coding that so let's take a look now and see what it says All right application is live because it can query the database What's running those databases and querying that what's actually we can actually throw in a log to so, uh bug database That's past right so if we look here And we're logging from here too. All right, so That's our liveness and health checks for small awry liveness Yeah, um, you can add the readiness uh thing to there's a readiness annotation too Yeah, so we can do a ready. We can do a we could have done this as a readiness, right, right? Yep, um, I did adding this they're kind of the same things, right? Well, they're not the same things, but yeah, I could I could have done this as readiness too, so it's kind of It's pretty similar so functionality is pretty similar the behavior that you're trying to engender Is is a little different so yeah, because uh, if a readiness check fails, we really want to stop traffic on to that Versus restarting the container possibly All right, so that's a ready All right, what do we want to look at next well now that we know the thing is Up and running we we did some um health. We um can trace the The actual flow through it There's some additional functionality like fault tolerance that we we want to add So what happens if you fail, right? What do you have to say? Come back here didn't we we had a little we had a little error earlier, right? Yeah, we did yeah I don't know if that was by design because this is a demo, but yep. Here you go Getting some errors in there. All right, so let's see. Why do we have this error? Like we're going to need to see why we have these and what what kind of exception was that that was a runtime exception let's see what it was yeah, it was a uh runtime exception service failed random agent imf agent repository java line nine, let's see what we have here Um So java line 29, uh, some idiot wrote some potential failure code in here, right? What we're doing, we've got uh an atomic long. This is also based on corgis examples So we just have an invocation number, right? If the modules of four is greater than one um, we fail it right if it's uh, if it's uh It's not and uh, we're going to be successful Um, we're logging this failing in the logs. So if we look at this in the logs, let's come back and do a few of these We'll look at it through here. Is it a random imf agent now? so in our logs hb request failing with 15 right 15 modules four is greater than or equal to one 16 is not it's good 17 18 there we go failing with 18 right so Here's what uh, so we we need to deal with this right. So how are we going to deal with this? Well, let's uh, let's first let's try um, uh, let me try it so that we can Uh, let's put a retry on there and see what happens when we catch that exception All right, so go to the method So right here We'll have to add an extension right? Oh, that's right. We do it. Oh, yeah. Yeah So, uh, we have a really easy extension to add. Um, It's just a small write dash fault dash tolerance And again, all this did was add that to the palm file Right you can see that Yep Also, let me just make sure intelligent nodes we've updated the palm file And uh, now let's go to your method and And We want to handle this and we'll just do handle it at first by putting a retry on it. So It doesn't seem, you know Terribly malicious. So we'll say retry on equals And that was a runtime exception. So we'll do runtime exception dot class No, no and not quotes Perfect comma and then we'll we'll do a couple retries. So we'll say max retries equals three because that's the default Right, but we'll we'll just graphically demonstrate it here And then another comma and then we'll say let's delay it for um Some time period. So 150 is short enough because it's a pretty quick call and you're on a mac and it's really fast, right? So So what we're going to do here just to recap that was, um we're going to Every time it throws that runtime exception We're going to retry it Um, and then we're going to have a little um delay added to it So if you go back and um, uh restart it I'll start the server. Yep Fire core goes back up And we should see that we have a new uh, we have a new plugin here too Small rye context small rye fault tolerance right there. I just random i mf agents so actually let's uh You guys know there's a little bit of a pause right there. Yep So what we're not seeing is there we're not seeing the exception, right? So what's going on is it It hit the exception it it stopped for a little bit and then it um, It retried the call And let's We notice we see it's telling us it's fails, right? And then it returns some right and then it returns random and then it failed That's okay because it just gets called again, right? So no, um, if we see our errors right there, right? Returning so we're we we're experiencing errors, but it's it's okay, right because we're catching that You know, I almost want to make a comment about did we just throw all the exceptions away? We did just throw yeah, we did but you know what we're going to catch those a little bit when we talk about Let's like examining the logs. So Um, we'll come back to that this is also also to like one thing I probably would not actually recommend doing this through um Like we're just we're in line, right? So this is the same application We're making an inline memory call typically I would do this if I was calling out to some kind of external service, right? Yeah You know, so if I was making a rest call, so I probably should have written this example to make a rest call So and just it just to recap on some of the core principles from the micro profile community So so far we we've really limited You know the amount of process that we've had to introduce here um We're we're able to experiment pretty quickly because you have already guessed that you know, Jeremy and I just do stuff on the fly and You know the barrier to entry is pretty low here, right? We didn't do anything much except add some stuff to the palm maybe enable a couple properties and then Put an annotation on there There are more complex things that we can do with open telemetry and and um Um stuff in micro profile by adding that into our code and creating spans and gauges and other things We didn't want to get deep into that today, but um, we just wanted to show you how to get up and running pretty easily So later episode Yeah, we could do um, you know some really deep dive on the whole um span and tracing thing with uh that That could you know sampling and other things like that we could deep dive on some of the Stuff um, you know what happens when you propagate that information and you know Put it in a time series database and make it really huge But um for now we just want you to get started easily So one of the next things we want to do is if we hit that exception and we have a problem Um, can we create something like a fallback method? Oh really cool. You already had it up and running. Uh, so we'd say uh Actually do fallback method equals and then that name Thank you. All right. So now if we notice um conveniently, I have a fallback method right here um And I will return a new imf agent with uh, Ethan hunt here, right? He's our default hero So, uh, now I have a fallback method. So let's check this out. See how this looks. Let's say uh ah So it's every time we hit the exception now um We're we're actually hitting that fallback method And we're putting some default information back in there, right? And one thing you'll notice here I have an id for grace because she's in the database and uh Ethan is not in the one our default one that i'm returning is not in the database Right, so if you look in here, this is the panache entity. It gets by default. It gets a database id, right? Um, so this is how we know we are falling back. Of course, we can also look at our logs and see who we are occasionally getting in there, right So what happens if we keep hit, you know, we have multiple customers hitting this site many many times and um We're really making the system kind of go crazy here. So Let's could we do a circuit breaker instead of a fallback? Um, we can do a circuit breaker. Yep And actually before we leave the fallback topic one thing I talk about talk about fallbacks Because this was something I read a long time ago about netflix and I thought it was just a really great Example about working with your business. So one of the things when netflix I'm sorry when amazon first got into the streaming business, right when you would go because they were going to compete with netflix, right? So they said one of the discussions they had was what happens if we can't charge a credit card So I go in and I you know, I search on the tv. I go to amazon prime and I click a movie I rent this movie but something goes wrong with my credit card And they said the default for that was to approve it Because they thought Initially, they would lose the royalties they had to pay they would just eat the cost of that because it was worth it To try and capture the audience and if they had if people had a negative experience They wouldn't use the service again. They would just give up They wouldn't bother trying prime again. They would stick with netflix, right? And so it gives you an idea that fallback methods like this Give you a way to really react with your business. Like when I have errors, what is the behavior that you guys would like to see? Right, we're just returning egon hunt, right? Because you are a default guy But if this is a recommendation engine or whatever you can talk to your business and what is the fallback method, right? all right, so Our little soapbox about aligning with the business is all you never told me that story before so good story. Yeah, that really is so um Now if we have a circuit breaker, this isn't necessarily the same as a circuit breaker like um when you're in kubernetes, but um In this case, what we want to do is we want to um say, uh, let's set a request threshold first Oh, yeah, yep yep What do you want to do? Uh, no, don't uh, yeah take out the pail on sorry So the request threshold is uh, we're going to set that to four because I think that jives with uh, jeremy's Code there. So what this means is is that? after um You know We hit a um an exception or some kind of issue here um We're going to fall within you know every four kind of thing and then we want a failure ratio So do comma failure ratio after that So let's do I don't know 0.5 or something so If once we hit the the threshold and we hit the error, um If we hit another error like 50 in this case within the delay time period The the circuit breaker has been tripped and if we hit the the ratio within that trip period Then we're going to actually fail out of here So let's take a look at what this will look like And if we trip the circuit breaker, right? Yeah, um, yeah, we got a trip to circuit breaker. We haven't tripped yet. Are we no Okay, it's tripped now, right? Now it's tripped all right now Say want to trip the circuit breaker if this is really um, you know We're hammering the website and we want to just stop the traffic going there because um, You know, we're getting we're getting inundated by somebody with this Oops So now we should not see anything saying returning a random eight Mm-hmm now we could put a custom exception in here um To deal with that So what we can hit the logging Later on but um right now we know that we want to stop this traffic because it's it's really doing damage to the website I haven't been able to trick it. Okay. Now it's tripped. Yeah Circuit breaker open exception, right? So we're getting a different exception Right, and we know and we would be able to handle that inside our code again I wouldn't use this in terms of inline code. I would use this when I'm calling some kind of external service, right? Or sense to to do that But that's how you use the circuit breaker Should have should have wired this up to call an external service And we'll do that. We'll do that when I committed to yeah, but we we can't you know We couldn't find an actual tom cruise api anywhere So if anybody wants to take that on it did look I did briefly look for mission impossible mission impossible in particular But also tom cruise apis. Um, I didn't find any of those Any free tom cruise or mission impossible apis? um So let's you know, let's look now. Um, we want to add A lot in part. So what we did, you know, we looked at the health We looked at um, you know, the tracing kind of capability. We looked at the fault tolerance all right, so The next thing we want to do is you know, how can we actually look at those logs so that if we correlate that tracing information? Can we correlate that exception information? Okay micrometer Yeah, why don't we do that all right and for me to use yeah if you add the extension for micrometer Dash registry dash permit is I think we'll add the functionality that we're looking for yeah micrometer dash registry dash yes All right, we've added an extension here. Let's uh, so now uh the next step before you add any code Let's go in and look at the properties file real quick because we need to enable a couple things in properties And then I honestly to make sure that uh, I wish I don't I don't have a keyboard shortcut for this Sorry, um patient properties okay, so there's some Default things in here, but um, we're gonna enable a bunch of things just so that we can show you different kinds of Paths that we can get to to to see some of these metrics. Yep. All right. So let's come back here and we'll say Firequark is back up now We'll see if we see a micrometer plug-in executing here and we've got we see it here. Yep right there micrometer So let's come check Let's check this out Do a couple of these Actually, let's just do quotes random. I want to take the circuit breaker out of there that might help Yeah We'll just do different ur. The reason we have three are urls. Excuse me. We have three different examples to deal with Um, so this is this is our best quotes So from movies if you're dealing with someone who's crushed a stab shot and detonated five members of his own INF team how devastated do you think you're gonna make him by marching ma me and uncle donald down to the county courthouse Um, so that's a nice quote. Um, let's take a look at our dev ui here. Oops And let's go to our extensions and micrometer metrics, right? Yep. So what is this bunch of stuff? Right, holy cow. So now we're actually pushing stuff out to Prometheus Which is pretty cool because we didn't really do much except add the extension in there and enable some properties Right and we're getting yeah a whole bunch of you know jvm Can't see your memory use jvm threads, right? Yep. All right. So you don't see this in json if we want to get json. Yeah, let's uh, let's go to, uh, localhost 9 000 Q metrics json is that you already got it up maroni? um Yep. Oh, that's another way to look at it. Yep. Just slash json No, uh, q metric slash metrics slash json q Oh, you mean regular local sorry locals in 80 q metrics slash json uh-oh Okay, demo gods All right. Anyway, so this is what i'm looking at json Oh, was it 9 000? It's 9 000. Did you have 9 000 in there? I can't see 9 000. Yeah, there. There we go. All right. So that gives us a little different view and um Why that's important is because if you have different kinds of collectors on the back end And there's the raw prometheus one, right? Right. So if you have different kinds of collectors on the back end You might have some third party stuff that's collecting this Uh, we can put it, you know, put this information out in um different formats All right. So another format would be you did localhost 9 000 q metrics and then instead of json just do prometheus Yep, it's a two different. Yep So there's the prometheus endpoint itself There's um your dev ui where you can see that prometheus output you can see it in json um, and when you get the json page You must be using Are you using chrome? Yes Yeah, because when I get it in firefox, I can see a really nice Uh json output that's formatted Because json output's okay Yeah, it's just yeah, you see the numbers on the right hand side there It's all nicely formatted and I can you know actually save it as a file right from the ui from him when I do it in firefox Not that I have anything against google, but um Yeah, there you go Looks a little different there in a different browser, right Yep I tend to use firefox more when i'm developing All right, um, let's uh, we can do some more stuff though too right so we can get some better out So some other things, um We might want to find uh figure out, you know, how long Did that take, you know from a timing perspective? So we can add uh really easily at time And um, you can put a value in there that's just you can put at times with nothing Or you can put a value in there for like the class name dot the Method so value equals Yep, uh, we will call it them quotes here them quotes Yeah, oh we have nothing we have nothing There you go Let's Give you the annotation i need to relate the classes and getting reloaded there so Or let's see what what's up with that. Let's we'll bounce quarkus. See what happens here Yeah, if all those fails turn it off and on again, right? Yeah, all right. There we go. It's we're really good for it. We were saying, uh Really spring source Find it always happens during the demo. See how easy this is Okay All right. Well, uh, there's really only one other annotation that I can think of that we can put on there, which is um counted and that's really um Yep And we can put um, no actually we can put a um Oh, you know what this might be quotes underscore For counted if you put the uh value equals time now time dot now there might be something going on with our uh Collector to let's try this Why can't I click it up? Yeah Okay, um, some things that we could do internally we could um, there's another thing called a gauge. Um, we don't have to go into that right now, but um That's just gonna allow us to um actually use the registry directly and actually set a gauge from a timing. Um directly into it So there's a bunch of other things um You know from a deep dive perspective, um, we could go into any of those uh in a subsequent session But for today, you know, what we really wanted to show you was, you know, uh Micro profile the ability to uh pretty simply and easily add um some health checks some, uh tracing kind of capability The ability to add some fault tolerance to our applications And then uh, if we if we had our collector work and write the uh demonstrate some metrics So logging metrics and tracing those are the the three things um that we wanted to look at Why would we do that? Um, we kind of discussed that a little bit and um What's next Jeremy? What do you think we're going to talk about? Um, you know next time here I don't know. We have next time. So do we have any questions for start with? I don't see anything in the chat right But um next time, uh, I think next time when we get together we want to do a from scratch coding Maybe on um web assembly because we've had quite a few people about what web assembly is and instead of You know just putting up some slides and talking about it that way. We thought we'd write something from scratch What do you think of that maybe in august? yeah Web assembly sounds good to me. Yeah and what the advantages are Why it's different from the jvm, right? All right, well, thank you very much for joining us today. Um, if you have any other questions or anything I think our contact information you should be able to find us pretty easily um If you want to make fun of us for having the demo break, uh, you can do that too. So, um Next time, uh, we're gonna talk about some web assembly and if you want to see more detail on The telemetry stuff or you want to go into like a deep dive on like, you know, how to create spans and do, um Some sampling and stuff like that we'd be happy to put something together for that too And go into a deep dive detail on that All right, thank you very much. Thanks a lot. Have a good have a good afternoon