 Good afternoon. Hey, good afternoon everyone. Thank you for joining us again Today Jeremy and I are gonna talk a little bit about micro profile And Corkus and why that's relevant to us. So cue the slide Jeremy We have one slide today the rest of the time we're gonna talk about code Because we know that you prefer the the code over the slide, but we have two slides Yeah, we got an intro slide You consider the thank you side so yes, what is micro profile so Microfile was created way back in 2016. I think with IBM Paira Red Hat Tommy tribe and really it's a set of specifications that were added to Also brought into the Jakarta EE Umbrella and really today there's like 12 specifications in the micro profile community and We're gonna talk about a few of them But you know, what are we looking at on this on this picture is? Config is really about, you know externalizing configuration and fault tolerance Is about defining different strategies to for application robustness Health is pretty obvious, but it really is, you know, what's the health of our underlying platform? JWT and RBAC is about securing the rest endpoints Metrics is about exposing the platforms and metrics open API is the specification for documents and restful endpoints Open tracing and open consensus got combined and that's now part of telemetry and But it's still right now backward compatible So we're gonna go over that and then rest there There's some that are like individual components outside of the specs. So those things on the right So like context propagation graph QL Reactive streams is a really a pretty cool one. So if we want to catch streams on reactive Streams messaging is also in there. I myself and Jeremy use that for You know Kafka Sometimes, but there's really also a bunch of core principles that come along with this So my micro profile foundation has some core principles like it's got to be open source vendor neutral Community and collaborative, but what we're gonna talk about today is some of those extended tenants like Limited processes. So do we have to have a bunch of processes to? Use micro profile, can we experiment and innovate quickly while using micro profile and How how high is the barrier to entry? So what we're gonna show today is a Little bit about Corkus's implementation on micro profile. You can also find that implementation under Piara and Red Hat JBoss EAP and wild fly So if you're doing jacardi EE or java EE today, you can start using many of the things that we're gonna show you today Also under those environments. So why don't we get rid of the slide because I Really hate slides at the end of the day and we can jump into the code. So Jeremy, maybe if you want to talk us through what we're looking at So we'll let's turn this on here. So this demo application so I Saw a mission impossible the new mission impossible day before yesterday. My daughter's a really big mission impossible fan I don't that extends to all of Tom Cruise or just mission impossible I think mostly just the mission impossible movies. It's really good If you haven't seen it if you like that series, they're also battling a large Computer virus is the bad guy, right? So it's it's nice An AI that's turned sentient, right? But since that's going on I kind of thought I would make an application based around mission impossible. So last night We built this application. It's called Mission observability On github, right? So mission observability Yeah mission observability is is the repo So what it does a few things I've got postman I'm here as well so we can get movies all the movies, right? We can get a random movie So this is just gonna give us a random movie here Right dead reckoning part one was the one I saw last night and that computers a bad guy Ghost protocol rogue nation, you know, all good stuff fall out I like fall out a lot probably because like it's in Paris like they're just racing around Paris We also have IMF agents so IMF agents What's an IMF thing an IMF? Yeah, if you are not a fan of and feel free to ask questions about, you know Small smaller eye or micro file or mission impossible. We can try it. We'll try to field any questions IMF agents is the impossible mission force Which is who our Protagonist work for there's one notable one missing here But I forgot to put in the database Which would be Ethan Hunt, right? So Tom Cruise is not here But this is the rest of Tom the IMF or at least some of the other IMF people. We can also get a random IMF agent And so, you know, you see I even catch Grace's last name. Oh an error Oh, oh, we're gonna have to deal with that later you with that later. Yeah Here again. Oh another one and then there's some of the best quotes from the movies, right? So there's all the quotes and of course we can get random quotes again, right? So Random quotes. So what's done is done when we say it's done, right? So if you guys know we also stream this at eight o'clock in the morning ideally to capture people in the EU and UK And we did this right at the end. We the random one that came up was this which I thought was kind of perfect We'll see if we can maybe make that happen again today, but it's Probably won't so some of the things we're gonna be talking about here. So here's our application, right? We notice we actually have one problem in there and we have no window into what's going on inside this application But it's a basic corpus application If you want to look here, we've got We screen up I like to organize stuff along the line of the domain and infrastructure So I have domain objects like IMF agent, right? That is a panache entity If you haven't seen panache before really fantastic extension of hibernate that makes it really easy To do database stuff and I like to use repositories. So I like I like DDD patterns, so I would like to interact with the database through a repository Which means I can have multiple different ways in and out and you can develop using hexagonal architecture, right? We look at what a repository does you just implement a panache repository also again makes it really really nice and easy to use Actually, I shouldn't show that one because that's the one that has our bug in it And then I have resources like our movies resource right here, which is just a simple You know rest endpoint, right? So path and movies. I Injecting a movie repository and I'm running the stuff right through here. So Pretty straightforward stuff So first things first if we're gonna just start off getting some observability in here So Rob, what would you say would be the first we would probably do first to find what we're talking about from observability. So Everyone's familiar with logs. So we're gonna talk about logging today And we're gonna talk about metrics and we're gonna talk about tracing So that's how we're gonna define our observability So I think one of the first things we might want to do is we know that that that Method that you're calling sometimes throws an exception So let's let's figure out if we can put some observability around that and add some Telemetry so if you go to the command line and we can add an extension to this project through a corpus extensions and say Open or a corpus dash open telemetry or just open telemetry and that will successfully run which we always act surprised during the demo of something works and If you go to the palm file we can see that it added a an extension and therefore a spur dependency There you go, so that's the only thing we did so far If we go into the properties file We might want to do something in properties really quick and Enable something in properties so that we can see what is going on here And yeah, I cheated right so these I'm not gonna I don't remember how to type all this stuff So the the corpus otl Exporter there is a type of exporter that we're gonna use here. That is actually defaulted in in Corpus right there, but we're going to explicitly put it in here just for conversation sake So if we just do this and then we run it Let's see what happens now. What we didn't tell you was is that in the background Jeremy has a doctor compose file that has two things running in it Maybe if you want to switch over to that real quick just to show them and we have Yeager which is going to be a collector for us and collect this information and We're also running Prometheus for something that we're gonna do later. Yeah, here's my compose file mission of durability We have Prometheus and Yeager right and then how else I've been playing with dapper So I slide that stuff going and I was just doing FTP stuff So I'll stop that like when Jeremy opens up the screen because we can always see what he was doing last Then this is my current application is running Postgres, right? So I'm just running that using The dev devs. Oh, yeah Why don't you show them what dev the dev view is so that we can understand out of the box What corpus gives us with the dev view? so 8080 so Have you I? See our dev UI and this shows us all the stuff. We're going to be using inside of here, right? So we have data sources Persistence units, you know, I create drop script for all my tables, right drop scripts It's really nice when you're developing because you can always just come back and use stuff there And then we can find our ORM stuff. There's our open telemetry, right? Yeah, the tree and then dev services come down here shows us our actual data source connection and Was it's that way if I wanted to say come in here and Set up a connection right here with my data source. I can write so it's the data source postgresql and localhost 54669 so It's gonna it rotates ports. I'm now the other thing to it. It's interesting to notice is this is not interfering if I run Let's test the connection Yep, it's good. Okay So I can now see my stuff What? refresh Yeah, there we go And we can also see court Kafka in there too. It'll start something for Kafka. Yeah, you know what I need it I Wrong database database is actually pork us. I'm not gonna know this only happens when we're we're we're showing somebody something This wasn't even part of the demo So let's go back to the actual demo So, what did you want to do you wanted to See what I'm gonna get for just adding To the the project are there some random quotes actually we should read some of these so right because they're fun I am I am the storm, right? So I would have thought the hardest part was serving that pressing need of yours to get your gun off We just rolled up a snowball and tossed it into hell now. Let's see what chance it has. Okay, that's cool So, um, this is our Yeager dashboard, right? And if we know our services, it's already grabbed our service, right? So it sees our mission observability service. This marries back to this thing right here Yeah, I'm in this mission observability service And so we do that operation. It's got a bunch of operations. You see the WI operations, right quotes random That's one that I've been Looking around with here. So we've got some traces. So So Rob, what's a what's a span here? So let's click on the span and look at it. So Now that span is just that call and that's gonna show you some basic information about that call and That's just what you're getting out of the box, right? So You know that we're able to view so we know the endpoint now the point of all the telemetry together So logs and traces and metrics is is that I could use all those things together to triage and figure out problems And one of the things that we can do is use the span right off the bat to Say where where did we actually enter this call? So a lot of times your company might have a third-party Software that they bought in order to do observability from the outside in but the to me the really interesting part Is actually what goes on in your code not the cause between things, right? So they're always looking you know for failures between things I want to see what's going on in my code and the other thing is you know, um, you know take a simple use case like Jeremy wrote the code. He leaves. He didn't document it and we got somebody new that's gonna take over the code It is the comment Code is the comment. So if I already have some tracing involved in my code I could tell the developer you know what go sit down work through some of the use cases and Click on it and see how it takes you as a flow through the code So in order to do that we might want to add a couple additional things. So what if we wanted to name the span? Do you want in a span first? Yeah, let's name span first. Okay. That's okay. You could left that we can We're on quotes random, right? Yeah So there's a bunch of things that we can do and one of the simplest things that we can do is we can say with span and Then we can name the span Give it a specific name. So it's not just looking, you know us randomly looking through a bunch of Stuff for an endpoint, but we can actually name this band and do a quarry on it, right? I Need to keep getting that error. We're gonna have to handle that eventually. So If we keep all right now if you look We should see a name span in there and there you go All right, so there's a bunch of other things that we can add in our code to follow code around through but Just from you know Getting started and low barrier to entry. We're gonna stick with some of the stuff That's really just about you know what we can do with the annotations kind of thing So one of the next things we do we know that there's a database involved, but we don't actually see that yet there and Jeremy kind of Showed us a little bit ahead and so we can add open telemetry JDBC And we can have that database participate those calls to that database participate in this now Yeah, now this one is we couldn't add from the command line. This is not actually a corpus extension, right? So right this in and then all right. So yeah, so corpus pick that up dev mode pick that up We've rebuilt and we deployed so I don't have to balance the server or anything. So let's Come over here and we can do a few of these. Oh What's done is done. We say it's done. Yeah gentlemen, this is Solomon Lane. Mr. Jeremy loves this series of movies. So I Haven't seen him yet. So I'm gonna have to watch Yeah, they are good start starting with number three. They're really good. All right. So, um It gets quotes random. Yeah, I think we there's a two spans there now, right? Yeah, we should see music Yeah Did not pick it up. Yeah, you need to bounce it. Oh Could be and the instrumentation of money to bounce it How do we compile though? Let's see. Well, I wonder if I need to bounce Yeager. Oh my guess range of it. So That's just the Yeager queries the air craze. I'm interested in that Operations get quotes random. Oh, you know what I need to do You got to go into properties How to go and tell and turn on right? Yep. Yeah, you gotta start there you go So live debugging, right? Um, we didn't turn on the properties. Now you need to bounce Quirk or something Or you could try it. Yeah, there we go. Maybe any bells for that Yeah, some properties files will pick up some properties. Well, I don't always pick up. So now let's see All right, so some quotes operation Let's say quote random quote Now I have four spans, right? Yeah, so if the guys that were demoing this, you know could remember everything so Sometimes you're gonna have to add a property. We'll try to talk you through some of that but really all we did so far was add the The dependency and then we added the property and now we can see that we made a jwc call And we shouldn't be able to see the query down there, too, shouldn't we? Yeah, I I've expanded the This too much so we get down there's a good connection We expanded to here You can even see you can see the connection string, right? You can see the database statement that we're actually selecting Yeah, so it's it's really nice amount of stuff that we can get out of this cool So now we've named this band We still haven't figured we can see how the timing is working And we can see how much time each part of the traces Um, again, there's a bunch of other things that we could actually do in code to do this Um, you might be wondering should I use this at in production? I would say uh start off in development and only Only add the tracing capabilities to the things that are most interesting to you as a developer So I would start with things that You know, you think could go wrong and what would be interesting to you as a developer if you had to debug something and You know that happened from production Only add those things first otherwise if you add this to everything you're going to get overwhelmed with the amount of information That's going to be output here The other thing is is that uh, what we're not showing you right now is is that uh, I personally would take Instead of going straight to yeager. I probably pushed this off to a sidecar So that I could turn this on and off in production through a sidecar So we might push it out to the sidecar and let the sidecar decide how we're going to You know forward this to whatever our collector is outside of the sidecar I don't know you got any comments on that general. Yeah, I was just going to mention that um, the way you can do some of this is false, right? so Properties are parameterizable and The word coding it here. This is super easy to pull from a config map or a secret You know if you're in communities, right or from properties or from command line Right, so there's multiple ways we can pass this in so you can have Your application set up ready to go and you can toggle it like based on the properties of a config map if you're in production Right. Yep. Yeah, and because yeah, you don't you probably don't want this one all the time So before we figure out what's going on with that exception Let's uh, let's add a couple more things. Um, that let's us determine at runtime, you know, how healthy we are from the get-go so I think if you add go to the command line and do uh, court this EXT add We can add small right health Yep, so all right Now all we did was um add small right health And if we go back and run it Yeah, we'll get we'll get functionality for free essentially, right? Yeah, without having to do anything So we've got our thing here you Oh So just by adding that to the project Uh, we can get a health and easy health check to say whether or not This is up and running. Yep. And uh One of the nice things we have here is it knows we have a database. So it's already implemented a database check Whoops. Let's uh, come back to our dev services and now in dev There's also health services. Where's health services? Uh Right there right right in front of you right in front of me Oh Healthy right there. Yeah patients ready and database connection is health check, right? so So we added we added health um What if we wanted to add uh, you know libeliness probe? All right So while uh, jeremy's doing that um, just for those who may not know the uh There's a nuance between liveliness and readiness and liveliness is really about Can we if we fail should we restart a container possibly like if we're in kubernetes? And readiness probe is really about if it's not ready Um, should we actually stop the application from serving anything up for traffic? So we're just going to add a uh A liveliness probe here And this is so it's application scope being I need to put a one other annotation here. Yeah, because this is a cdi being Um, you all the normal stuff you'd expect to be able to do right? Yeah, so Um jack stuff in here too to test against right? Yes, let's say if our databases aren't up. We're not live right so I can inject things so I can inject my movie repository movie repository I can Inject Quote repository quote repository and I can inject my imf agent repository And then I can write some nice custom logic here. It's actually a little bit gnarly. So let's say if um movie repository list we just account to let's do list all size greater than or equal to one and and imf agent repository list all Size is greater than or equal to one and and quote repository list all size is greater than or equal to one We'll return health check response up is up and back into the database Um, and then we'll if it not we will return health check response down So obviously this is where we can put some custom code to do some checking so, um When we do those libeliness probes, uh, you know in production we can test Whether or not we should even be making this call or we should Up and running, right Uh, now it's up for boarding health status down check our response status down because you restarted I think Yeah, well, I think I might have left it patients clearly working Uh, exception class trans out. Here we go. We didn't put a transaction on the cdi beam Yeah, so this is just crapping out. Um, and it's a cdi beam so you can do things like manage transactions All right, now I go yeah applications up the character of the database, right? So now we're Right Well, that's nice That was pretty straightforward Yeah, it's pretty easy. Yeah, right So that's cool. Um Now that we've we've done. Let's see. What have we done? We've we've Instrumented it so that we could get some traceability in there. Yeah, we've instrumented it so that we could get some Observability with is it up or down? Is it ready kind of thing? But we still haven't handled that Exception right so why don't we why don't we do that now and uh deal with some fault tolerance? So we can do small rye dash fault dash tolerance And we should show it So small rye by the way, um Small rye is a project or umbrella project for micro profile and some other stuff Um, I don't know where it's really pretty. Uh, it would be cocked picture came from I have no idea what his name came from um But uh, the projects inside of here, uh, most of the most of the uh, micro profile stuff So config jwt health check all the stuff you saw as per um, uh, micro profile in here As well as some other stuff right some rest easy recs client and some other things Small rye mutiny is also reactive and reactive messaging. This is some of the most interesting stuff that uh that Workers has but there's a lot of stuff under under the small rye banner So that's just the community. Uh, the community and so you'll see when you see small rye That's what we mean. All right, so we're up here and let's come back to this. It's this quotes one No, it's imf agents that was giving us a problem, right? I have agents Still getting an exception Let's see So there's benji done Yeah, there we go. Oh, and uh, we're getting our runtime exception that says service fail, right? So yeah, so let's let's jump into the code and um Go to that that method Oops So this is we'll start from the beginning, right? So here is our random agent, right? So what are we doing here? So let's let's add a retry in there Let's add a retry. That'll be one nice easy way to do this, right? Yep. So we can say retry Um, just do retry on equals And then runtime exception dot class And then we can say max retries the default is three So but we'll graphically put it out here and then do a short delay Oh, yeah 150 seconds, right? Yeah, because you got that nice mac m1. That's really fast. So, um Yeah, I think he's Sometimes you notice a little bit of a pause Yeah, I saw a pause, but I'm not seeing the Yep, but I'm not seeing the exception anymore Yeah, let's I bet we can find the exception. Yeah, right there is Failing with 19 excellent feeling of 18 feeling with 15, right? Getting failures and we're getting errors right there, right? So how are you generating those errors by the way? Did somebody inject some code there when we weren't looking? Probably what happened? It was it must have been the entity from the movie Yeah And most bad jokes we can make about this movie. Um, but yeah, yeah, so this is the the uh, the entity Which I guess I had no spoiler alerts from the movie, but uh, but a computer is a is the bad guy So, um, we've injected some code here. Um, all we're all new and I've got a counter here and, um Just getting the number of that counter and if it's If you can divide it by four, it's fine. If not, you know, it's not good And we just throw a new run time exception saying service failed, right? Otherwise we just return this so obviously by putting in the retry agent We're just gonna fail it who cares, right? So we're kind of eating the exception though So a couple things here, uh, we haven't looked at you know, obviously it's going into the log someplace some it's logging somewhere But we just kind of ate the exception. I don't really like eating the exception. Do we do like a fallback? Yeah, let's do that and let's let's solve this here, right All right. So with a fallback we can say fallback method Equals and then give it the method name And then conveniently I have a a method here Default iMethod that returns ethan hunt who is conspicuously missing from our other one, right? Since he's kind of the main yeah, so before you go uh on there tell me tell me that story you were telling me earlier about Netflix or something. It's all I will so so and also, you notice here when we get ethan hunt Uh the iB is null because you're not in the database, right? So instead of eating the exception we're we're now going to this fallback method and outputting some default data, right? Yeah, and a great example. I heard um, it was a story from amazon when amazon was first getting into streaming video, right? They had a question to ask about what happens if you go in, you know, you select your video and your credit card Process doesn't work and they made the business decision To fall back to allowing you to view the movie anyway because they were Going up against netflix, right? So they have an incumbent there and they realized people have a bad experience with amazon with amazon prime rentals Then they just won't use it again And so they said it's worth us to just pay the royalties and just eat it, you know So people have a good experience and we build up a user base but I think that's a great example of Communicating with your business right because in this case we would have to talk to our business to say hey And this is honestly this is um example Probably should have written this example So that was calling out some kind of external service because it kind of makes more sense there, right? But uh, it you wouldn't really do this in the inline code so much you would actually just handle the exception, right? But uh, you know you you communicate with the business to say like if we can't reach this service Or if this kind of error happens, what do you want to occur, right? We can return this to fault imf agent here in this case. So I think that's a nice illustration of you know working tightly with your business to get uh To solve your problems All right, so it's our fallback method. What if we want to do something else? Well, what if we wanted to add a circuit breaker because um, we're failing and we keep getting a lot of calls to this thing And it's it's just keeps failing, right? and we want to add The capability to um, just shut it down because it's it's kind of overwhelming the server So we can do this thing. Uh, it's a circuit breaker not to be confused with the It's a circuit breaker pattern, but not um, it's not, you know, like a kubernetes circuit breaker or something like that This is going to be um in our code. And so if we add a circuit breaker, what's going on here is um Basically after a certain amount of invocations, right? So there's the request threshold We hit something and then after a certain amount of invocations We're going to um, just fail Um, if we hit the time period that the uh failure invocations happen within so Jeremy um, Jeremy put a um A ratio in there that said if we failed 25 of the time out of Well So that's a runtime exception. Yep. Yeah, but it do like four Change the number to like four and there or something uh for the uh threshold No for the threshold sorry yeah, so Once the first error happens The timing starts, um, and then if we hit that threshold within that amount of time we actually Kill the thing and we know it's now. We're not hitting it right now. The circuit breaker's open. Yep The circuit breaker's open once the circuit breaker is open Um, if you keep hitting it within that time Then the circuit breaker is going to get kicked. All right If you don't and you go back then the circuit breaker will be reset Yep But again, this is this is probably pretty um Synthetic right to you're not going to do this in inline code You would do it if you're making a rest call somewhere or you know calling us out of process. Yeah, I I mean, uh, we used the circuit breaker pattern on caml Um, actually somebody just did a really nice article on that. Um Some redhead, um Great, so let's put let's go back to just the uh Either the fall back or the retry is that that's cleaner Yeah, let's see the retry All back, that's nice So we added all this stuff. Um We got everything, but we still don't have the actual logging So let's add a new um set of extensions here So we can add uh quarkus add micrometer And then we can add quarkus extension add micrometer dash registry dash prometheus You could put those on the same line. Yeah But I did uh same line I think So we just added Micrometer and the registry. So what we're going to do is be able to get metrics and we're going to enable that A couple other things. So what jeremy is enabling right now is um Just some alternative, uh output that we can get So the very first thing um is we want to catch some of this stuff and and prometheus all right, uh Here and yeah, you're gonna get prometheus Yep So if you click on that you get this lovely pile of soup and you can see that there's a pile of stuff being pushed out to um prometheus here and then we can also come check our gave you a ui say, uh Micrometer metrics we can take our prometheus style metrics Yep, and we can check our jason style metrics. So if you want to see this in jason, so the jason Uh looks a little ugly to me there. So open up firefox real quick because firefox actually Formats it better Uh, did you mean uh moral host? So do localhost 9 000 slash q Slash metrics slash jason Yeah, I see it's not I just take that and put it in firefox See how it aligns it nicely and gives you that option to like save it and do all that stuff on the on the top there Yeah, I don't know why chrome Is different. So if you're playing around with this look at it in a different browser. I tend to use firefox all the time Most people probably use chrome, but you will see uh, you know a difference there. Um, you also saw that germy had um Had it in q metrics prometheus, which was another output method that we had there yep And then you could uh do just 990 metrics We give you all kinds of options to do this, right? So um, now you wouldn't enable all this different kind of options, you know at at runtime just Do a localhost 90 90 slash metrics Yep yet another way to view it So this is where you'd have a third party tool that would uh, or you're gonna Eventually push all this into some custom elxtac to view some other way and Sip through it with grafana or build some reporting off of it But the point here is is that right now We did our health checks. We did um We did a some fault tolerance stuff. We then wanted to capture The logging and where would that go? And we can provide all this information so somebody can take and with a you know a third party tool, you know You could bundle all this together, but what uh, jeremy's also adding um here now is Some additional capability that says, you know, how what do what do we do? um, you know for timed right so um What do we what do we want to do there? Whoops I I do time now. Oh, that's under counted right yeah put the So there's a couple of annotations that we can add here What happened to my Do I have to Quite to balance it when it's uh instrumenting stuff. Uh, not all the time. See that's that's oh, wait You know what it is and do it again second time. What did you do? Oh, no, it's turned on Okay, so let's see Wait, there we go. Okay. Yeah, I guess because it's uh, so we can say do a search for that name Yeah, let's uh, if you pull up the uh, we need to actually generate some data, right? That'd be good There we go. There we go So So now we can see this um, there's some stuff we can put in the code So if we wanted to pull on the meter registry, we could create a gauge Something called a gauge and actually do a timing uh resource and stuff in here But before we even get to that, we're just going to do Something called counted because we want to add how many times this thing was called So if we wanted to correlate, you know, um that code that Jeremy had in there to artificially throw the exception Throws the exception based on um, you know, every every few it's going to throw the exception, right? No, do uh like time now dot now and that one Yeah, just do uh time dot now. Yeah Uh, you can get rid of random movie dot so We want to look at the metrics Around this saying, you know, how many times did this get called and correlate that with the exception that got thrown? we wanted to um show the name of the um The span so we correlated the span how many times the exception got thrown Where we can now correlate the logs by pulling that in um, and then we can add some fault tolerance around that to um To actually handle that You get your span ideas so you can correlate all this stuff together, right? Yep, now we can correlate all this stuff together. So If we do metrics tracing and logging We can now correlate all this stuff together now. You'd have to have a third-party tool to probably do it or write something yourself, but um The point is we actually can pull all this information together now Yep, so you see a number of invocations and let's just do it again here. Mm-hmm And let's do Fresh that You may have nine invocations, right? So just counting this the total amount of time it's called and stuff, right? It's because it actually like look into this take get a window into what our application's doing and what's taking up time right so again What we wanted to show is leveraging micro profile and quarkus There wasn't much process involved in order to get this going um, we did um simply added um Some dependencies Through the extensions that Jeremy, you know through the quarkus cli um It allowed us to experiment with some things in order to handle how we were going to handle the exceptions that are being thrown Um, it's pretty a low barrier to entry to get going It can be pretty complex once you start, you know wanting to add other things in here again, um You know your pred election might be you'll come in here and just turn everything on and start using everything But you're going to be overwhelmed by the data. So I would recommend You know just adding the things that would be most interesting to you as a developer Either first for debugging or things that you think you would need when you Probably hit something in production Because it is going to be a lot of data Some of this data is going to go out to like a time series database and so The more tags and labels that you add to the time series database the more it's going to mushroom out the amount of data That's being held in there. So just be cognizant of that. But from getting started. This was pretty easy. I think I think it's pretty nice and pretty and a pretty easy way to do things Yeah, and I didn't have to include Some netflix thing or zip can or some other external thing. It's built in by a standard Right. So I think that's another thing that I really like about the quarkus aspect of that Yeah, do we have any any questions or comments or feedback? Yeah, and feel free to you can probably find our information or to connect with us offline pretty easily So feel free to tell us how awful our demo was or how good it was because we went that positive reinforcement All right, so what are we going to do next month? I think I keep seeing all this stuff about wasm web assembly I was thinking maybe we code up some live web assembly next month and discuss why that might be Different from the jvm and what might be a value to it Sure. All right. So yeah, join us next month for a while. Sure. All right All right. Thank you very much for everyone joining us today. Hopefully you got something out of it and You know appreciate you Spending the time have a great day Thanks. Bye everybody