Level-up on emerging software trends: QCon London Software Development Conference, April 8-10, 2024

MMS Founder
MMS Artenisa Chatziou

Article originally posted on InfoQ. Visit InfoQ

QCon London, the Software International Development Conference organized by InfoQ, returns to the city on April 8-10, 2024. Over the last 17 years, QCon has always focused on the people who create and work with future technologies.

That’s why the Program Committee, consisting of highly experienced software leaders, carefully curates the QCon topics based on the important trends and essential best practices you need to know about.

Explore provisional tracks

The provisional topics in discussion by the Program Committee that they believe will have the most impact on software development in 2024 are:

  • The Tech of FinTech
  • Debugging Production
  • The Paved Path: Unlocking Engineering Velocity
  • Architectures You’ve Always Wondered About
  • Designing for Resilience
  • Architecting for the Cloud
  • Staff+ Engineering Skills
  • Platform Engineering Done Well
  • Lessons in Building Organization Resilience
  • Deep Tech: Pushing the Boundaries of Tech
  • JVM Trends: Driving Developer Productivity & Performance
  • Languages of Infra: Beyond YAML
  • Emerging Trends in the Frontend
  • Modern ML: GenAI, Trust, & Path2Prod
  • Modern Data Engineering & Architectures

A shared learning experience at QCon London

QCon London brings international senior software development teams together to share innovative ideas to pressing challenges, get clarity on emerging tech decisions, and build relationships beyond the conference. Here’s how your software development teams can get value from a shared learning experience:

  • Start your day with a team breakfast. Connect over a light breakfast at the conference. Plan your day, catch up on key takeaways, share new ideas, meet new colleagues, and catch up with people you’ve not seen in-person for a while.
  • Problem-solve as a team at QCon Unconference sessions. Work through the topics your team wants to focus on in facilitated sessions to generate new ideas for current challenges.
  • Come together over longer breaks between sessions. Dedicated time for you to bounce ideas, problem-solve, and meet world-class senior software engineers to personalize your team’s learning.
  • Unwind at QCon social events. Dedicated time to get together to reflect on the day’s sessions, share ideas, and connect socially.

Take advantage of the QCon London group discount

If you plan on attending as a team of 10 or more, you can claim your biggest team saving today. Discounts for all other group sizes will be available starting January 17, 2024. Email info@qconlondon.com mentioning the group size to secure your team discount.

Registration is open with the lowest available pricing. Save your spot now.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Duet AI Integration for Google Apigee API Management and Application Integration

MMS Founder
MMS Steef-Jan Wiggers

Article originally posted on InfoQ. Visit InfoQ

At its Cloud Next event, Google announced the introduction of Duet AI into its cloud services Apigee API Management and Application integration to support developers in building APIs, integration flows, and extensions that connect Vertex AI or ChatGPT to real-world data through APIs. These capabilities will come in a private preview through Google Cloud’s Trusted Tester program in the coming weeks.

Duet AI is Google’s AI-powered collaborator available across the Google Cloud and their IDE to enhance productivity. Developers can access Duet AI capabilities through a chat interface, available in the Google Cloud console, and IDEs such as Visual Studio Code and JetBrains IntelliJ (via Cloud Code extensions). By responding to natural language prompts, Duet AI in Apigee API Management and Application Integration automatically generates API specifications and integration flows using provided enterprise assets and context.

Apigee API Management is Google’s longstanding API gateway service, allowing developers to build, secure, and manage APIs. With the addition of Duet AI, they can create API specifications from requirements they describe in natural language. In a Google blog post, the authors explain:

These specifications will reuse your enterprise context, such as security schema or other API objects cataloged in API Hub. This is a big productivity enhancement, as building API specifications usually requires specialized knowledge and time-intensive development.

Duet AI can also recommend improvements by highlighting errors and inconsistencies in syntax, semantics, and styles in line with other enterprise APIs cataloged in API Hub. Furthermore, developers can create an extension to Vertex AI or ChatGPT from the APIs cataloged in API Hub.

The other product infused with Duet AI is Google’s recent generally available service Application Integration, an integration Platform as a Service designed to allow developers to connect applications and SaaS products with visual point-and-click configurations.  The Duet AI can create integration flows from requirements described in the natural language provided in the service through an interface. When doing so, Duet AI automatically suggests integration flows consistent with the existing integrations based on enterprise assets (such as APIs cataloged in the API Hub) when applicable.

Screenshot of Duet AI in an integration flow built-in Application Integration (Source: Google blog post)

Duet AI can create a default data mapping within the integration flow that connects the two applications based on the variables created in the integration flow and the integrated applications. In addition, Duet AI can also generate documentation and functional test cases using different data sets.

With Duet AI, Google catches up with Microsoft Copilot, an extension of OpenAI ChatGPT incorporated into service through Azure and Microsoft 365 offerings. No copilots are available yet for Logic Apps (similar to Google Application Integration) and Azure API Management; however, developers can, for instance, create policies leveraging GitHub Copilot.

Gabe Monroy, VP of product management at Google Cloud, said in a “What’s next for application developers” session at Google Cloud Next:

Through the Apigee plugin integrated into Cloud code, developers can stay in their IDE of choice. They can access Apigee and get Duet AI assistance right where they work.

Lastly, a signup page for Duet AI in Apigee API Management and Application Integration in the private preview is available.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Presentation: Enhance: SSR for Web Components

MMS Founder
MMS Brian LeRoux

Article originally posted on InfoQ. Visit InfoQ

Transcript

LeRoux: My name is Brian LeRoux. I’m very excited to be here at QCon SF, to share with you Enhance, which is a new HTML framework. Before I get into, what is an HTML framework, I think it’s important to level set and talk a little bit about how we got here and why you should care. Have you ever had a dependency break? Of course, you have. The reason I want to bring this up is, I don’t know if we always really see this happening and for what it is. When a dependency breaks in your system, you obviously have to go and fix it. Usually, that’s unplanned work. You don’t plan to have an upstream dependency come down and break on you. When it does, now you’re on the hook to fix it to keep existing functionality alive, which is time you could have spent not working on that dependency, instead of adding new value. As we like to say in Canada, does a bear poop in the woods? They do. Unplanned work is a real problem in our industry today. Unstable dependencies are just simply a time sink. They’re very common. Maybe they’re not totally necessary. That’s a question that we’ve been asking a lot lately. Bezos famously got asked the question, what’s going to change in the next 10 years? He’s a bit of a futurist. He almost never gets the question, what is not going to change in the next 10 years? He believes that that second question is more important, because you can build a business strategy around things that are stable with time. This is true of our dependencies. If we’re choosing dependencies that are unstable, then it’s really difficult to execute a business strategy and respond to customer needs and add value if we’re just chasing breaking changes, and spinning our tires, keeping the existing functionality alive.

Software is complicated. It isn’t made less complicated by more dependencies. Arguably, it’s made worse by more dependencies. Yet, in our industry, we are constantly building on top of each other, creating more dependencies. This isn’t really all that new. In the past, we’ve had some very complicated dependencies in the web, in particular, with web browsers. As different browsers matured, and as time went on, they all had slightly different implementations of similar functionalities. These differences led to a lot of thrash and unplanned work. Web browsers used to be really broken. The different browsers and the different browser ecosystems were very incompatible, and they would take very small capabilities and work on them differently. This led to things like jQuery coming around to fix that problem. The good news is, web browsers don’t do this anymore. Web browsers generally do not break their contract. We have solid web standards that ensure consistent behavior. Even better, in the last few years, browsers started upgrading themselves. Back in the early days, if you installed a new Windows operating system and got Internet Explorer, that was the version you got. It wouldn’t necessarily upgrade until you chose to upgrade it. The same was true for all the other browsers. Nowadays, browsers are what we call evergreen, which means that they upgrade themselves, which is really nice, because that means they’re forwards compatible. Because the web standards are also backwards compatible, so websites from years ago still work today. That’s profound. It’s worth bringing this back up, web browsers are backwards compatible. Breaking changes are generally an optional thing that you can choose to opt into. Just because you compile the web standards doesn’t necessarily mean that you get to enjoy them. This is the crux of Enhance in our whole talk.

Breaking Change, and Additive Change

The question that’s worth asking is, can user learned source code be stable in time? Can we make breaking changes optional or opt in? I believe the answer is yes. The two kinds of change that exists are breaking change, or additive change. Breaking changes are when we remove APIs or interfaces or behaviors and add new ones. Additive change is exactly that, it’s just adding a new API. We don’t take away the old API and replace it with a new one, we keep the old one and we add a new one. There’s tons of examples of this in time. Breaking changes are really common, especially in the JavaScript ecosystem. Angular 1 to 2 famously broke everybody. React 18 introduces some new semantics, which can break you. TypeScript 4.8 completely changed how TypeScript transpiles down to Node modules, that’s very breaking. That’s unfortunate, because none of that is necessary. Additive change, like what the browsers do, is when we iterate and we add new interfaces. HTTP/1 to HTTP/2, you didn’t have to do anything, it just happened. XMLHTTPRequest was the original way to do networking in the browser. Nowadays, we use Fetch. You got to choose when you decide to adopt Fetch. You didn’t have to switch to a new interface, and then have your old interface break. You got the option to upgrade yourself. Similarly, we used to do things called promises, or continuation passing, or callback KeyCode. Nowadays, a lot of time, we just use Async/Await. That was additive change. That was a new interface. The same thing for modules with JavaScript. There was a new type for scripts. We just got that change. Font, similarly, woff, woff2, additive change. Interestingly, Amazon does this as well with their APIs. The Amazon Web Service is very famous for having great stability. It comes at a cost. That cost is you’ll end up with some interfaces that look like this, which isn’t really all that great, but better than a breaking change.

Templating Systems

The frontend is very complicated. It’s grown very complicated, because it takes on whole new responsibilities. It’s a vast ecosystem too. It’s not just React. It’s React. It’s Svelte. It’s Astro. It’s Angular. It’s Knockout. It’s Backbone. The list just goes on and on. The worst part about all this, these littles projects all over the place are incompatible with each other. They often will introduce subtle breaking changes that will break their own ecosystems. There’s a few reasons for this. The first crack at bringing a lot of this logic into the browser was using templating systems. One of the more popular templating early systems was a thing called EJS, which was largely inspired by ERB, Ruby land. EJS lets you have some syntax with the opening paren and percent sign, and you can extensibly write a little bit of JavaScript inside of your markup. You can use that to template HTML content. We did all this because earlier versions of JavaScript didn’t have a string template literal. We have one of those today, and that’s worth remembering. We took a page from earlier runtimes, like Java, or Ruby, or Python and created these templating languages. It’s nice, but it’s like this little embedded language inside of your language. Let’s face it, this syntax is hard to read, and parse, and can be error prone. Templating languages generally evolve now into transpiling. Transpiling is a very specific term where we take text and we compile it into text. There’s not compiling, where we take text and we compile it to object code, we take text and we compile it to text. Usually, we take a non-standard dialect like JSX, and we compile it to standards-based language like JavaScript. JSX is really nice. You get a declarative JavaScript like interface, which compiles down to real JavaScript. This does require a transpilation step, and this code will not run in a web browser. This is a little bit of a misnomer to call this app.js, it’s app.jsx. It’s not going to run in a web browser as this is not standard code. This can’t change. The semantics can change and that creates debugging problems.

At least some of the non-standard dialects are really embracing it. Svelte has to get credit. They at least have a good file extension and openly will admit that they are creating a new language and they’re compiling to web standards. I think this is a much better approach. At least we’re being upfront with our tradeoffs here. There’s still the same problems with templating languages. You have to learn this new language. You have to understand what all these symbols mean and where they go. This isn’t HTML, this is like HTML. This isn’t JavaScript, this is like JavaScript. That’s going to create problems. All credit to Svelte for being upfront about that. They will claim this results in more efficient code. I don’t think that’s necessarily always true, however. The big problem with transpilers, and to a large extent, templating systems, as well, is that this creates obfuscated runtime code. This code is pretty bad. You can’t read this code. Debugging this code is going to be very difficult following it around and trying to trace what’s happening.

It even gets worse from here. It’s not just unreadable or hard to diagnose, it’s huge. Look at this? This is the same file, 1200 lines of code. This is a trivial bundle that I pulled from a popular framework’s Hello, World. This is not efficient. This is terrible as a developer experience to debug. If you’ve got an error in this code, you’re going to be dropping console log statements to figure out what’s going on. Some people will object and say, no, source maps fix this. They often don’t work, and especially don’t work in environments where it really counts like your backend in Node, which just got source map support and it’s not all that great. The other issue with transpiling code in the modern JS ecosystem is that we’re often stuck with these static artifacts. Because we’ve compiled it, and we’ve taken all this runtime logic and put it into Author-time, in order for us to do anything dynamic, we’re going to need spinners and loading screens. Because that code is static, it doesn’t have dynamic data. It’s not being run at runtime. It’s being precompiled and prerendered as best as it can. For anything dynamic, you’re left with spinnerammer, which is very janky.

Progressive Enhancement

There are just too many moving parts here. This is really complicated. The question that we’ve got to ask is, what can we get rid of? Can we simplify this situation? Can we get to the root cause of this complexity? How do we avoid it? To me, this is a very big case for progressive enhancement, which is a proven practice for building resilient websites. Sometimes people ask, what is progressive enhancement? The basic idea with progressive enhancement is that you start with working HTML. Then you add a script tag, and you enhance the behavior with JavaScript. Sometimes people call this HTML first lately. I like that, because I think that’s very honest with how the browser lifecycle works. HTML is first, that’s how a browser works. It loads the script tag, and then JavaScript is second. This doesn’t mean JavaScript doesn’t load or don’t use JavaScript. This just means that it embraces the lifecycle and the workflow of it. There are other cases for progressive enhancement. One of the big reasons that people will often bring up are ethical, for better accessibility. Some devices, screen readers, in particular, don’t interpret JavaScript as well, so having working HTML is generally a good idea. Then you can obviously add JavaScript on top of that, if the device supports it. Happy days, everybody gets the best possible experience.

There’s also a fully selfish reason here, aside the, avoiding being ableist and saying you don’t need to be accessible. That selfish reason is that you will have a more resilient website. You’ll have a website that always works, it’s more robust. People will argue, no one disables JavaScript. I think that’s probably true. No one does really disable JavaScript. JavaScript does fail a lot. When it does fail, your app will still work. Saying my plan is to not fail is cute, but that’s not planned. Progressive enhancement is to start with working HTML and add a script tag when you need it. Very often, you won’t. Very often, for many sites, working links and forms are going to be good enough. By all means, bring JavaScript to the party to make it better, but don’t assume that you need that first because that’s not how browsers work.

HTML first is not just a thing that some fringe weirdos are talking about. This is a movement, and this movement is getting bigger by the day. I think a lot of the old school web devs have seen this as the right way to build for a very long time. A lot of sites aren’t Node centric, so they’re built with Python, or PHP, or Perl, or Java. Progressive enhancement is just going to be how they build anyways, but lots of the Node ecosystems move in this direction just because it’s purely a better performance. Things like 11ty, which is a great static site generator, Remix, really started to bring this idea to the forefront with the React community. Then if you somehow got into the position where you have more than one framework, Astro actually supports them all, so you can compile them all but with an HTML first thing. That’s really beautiful. This is how things should work.

I agree with this, because I’ve been saying this for a really long time, with our backend framework, Architect. Architect is a framework for building applications out of cloud functions. We have tens of thousands of users doing this. It’s been around since around 2017. We always said just, return HTML, and progressively enhance it. People would look at me like I was a lizard for saying that, but I’m not. It’s a very valid way to work. If your dynamic cloud function endpoint can return JSON, it could also return HTML. If it could, then why shouldn’t it? That’s a good question to ask. It’s also a good question to ask like, what if our entire backend was cloud functions? We probably wouldn’t have the performance bottlenecks that we have with servers and load balance systems in old school databases. That’s exactly what Architect is and what we call a functional web app, or an FWA. We never really answered that question with Architect, and that’s why Enhance came around.

Recap

Modern JS has problems, pretty big ones. One of the big problems is that we have a bunch of brittle incompatible niche ecosystems. Svelte component is not going to render inside of a React component unless you pull off some pretty big magic. Even then it’s going to be very brittle. Non-standard syntaxes like templating libraries, or, worse, whole programming languages create very brittle output that is just hard to debug. That’s a pretty big problem. That last problem is static, not dynamic. You get spinnerammer, and I think that’s a terrible user experience for dynamic content, which the web should be really good at.

What Is Enhance?

The question we started asking the Architect project was, can our whole frontend just be pure standards-based HTML, CSS, and JS? Can we just progressively enhance it? The answer is yes. We never really packaged this up, but now we have. We want you to take these Legos and play with them. The answer is Enhance. Enhance is an HTML framework that’s built on top of Architect, so you get all the dynamic goodness. Its premise is really simple, you start with HTML pages. You use generally available web standards. You progressively enhance working HTML if you need to. Because the baseline is built with cloud functions, this thing is going to scale up and down to whatever demand that you need. It uses a managed database on the backend, so you can have dynamic data without a spinner. The deployments are wickedly fast because it uses infrastructure as code, and so it’s completely deterministic.

Demo

Let’s see if my terminal is handy. There it is. I’m in my home directory. Jump over to my desktop. I’m going to run npm create @enhance. I’ll give it a folder name of qconsf. Jump over to that folder, and we’ll run npm install for the instructions. This takes a few seconds. It has its dependencies like any other project, and a few of them are pretty big. The main culprit here is AWS SDK, that’s a chunky boy. Ironically, we don’t need to ship AWS SDK to production, we just need it for the local sandbox. I kick up my web browser now, we could see I’ve loaded Enhance. Here it is. This is our homepage. Let’s take a quick tour of where everything is and how everything’s put together. Ok, so I’ll kill my sandbox. Let’s take a look at this. In the root, we have a few files. We have a prefs.arc, this is just to say I want to auto-reload. We’ve got a package JSON with one dependency, and that’s this arc-plugin-enhance. We’ve got a public folder with some pretty typical static assets. We’ve got some prebaked CSS. We’ve got SVG files. The main event here is the app folder. Our app is pretty barren right now, we got app/pages, index.html. Say, hi from index, and some HTML. Let’s start the web server on the second tab. If I pop over to my browser. Reload. You see, hi from index html. Let’s add another page. This is similar to other frameworks out there like Jekyll, or Docusaurus, or the React one, Next. About, hi from about, let’s add some HTML, I’ll make this italicized. Pop over to my browser. I’ve got my index html. If I go to about, there’s my about. It renders HTML. If I deeply nested this, so if I was like, hello/world.html. Like a folder here world, hello, world. Hi from hello/world. I go to my browser. We have hello/world. There we go, we can see that. This is getting a bit awkward, I have to use the Safari URL bar, and Apple, they’re trying to get rid of the URL at the time.

Let’s add a header. Now I’m going to add a folder called elements. In that folder, I’m going to call file, my-header.mjs. Now, Enhance is running in the backend. This is server-side rendered. I named this file mjs, because in Node, it prefers .mjs for ES modules. Now, export default function header. Enhance elements are just pure functions that accept two named arguments, HTML and state. You return an HTML string. HTML is a tag template literal so I can put whatever I want in here, but for now, I’m going to put some HTML for my header. It’s good old semantic HTML here. We got nav. Nav is going to have some links. We had about. We’ve got hello world. We’ll close this nav. This is a tag template literal, with some HTML in it. It’s named header. Importantly, under app elements, it’s in my-header. Now I’m going to go into these HTML files I created and I’m going to add my-header. It’s going to work like you would think. If I add my header, it’ll expand it appropriately in each of these places. Let’s do that. I’ll add to index. We’ll add it to hello. If I pop over here. We’ll see this is unstyled, and that’s actually deliberate. Enhance ships with a utility CSS system and it does a reset by default. You can override it. You can bring Sass or whatever it is that people do these days. We think utility CSS has a lot of merits, so we built one in.

You can see if I click on these links, it’s going to take me to those destinations. That’s not that surprising. What is surprising is how this all works. We’ve got a little WebSocket code in here for the browser reload. If we look down here, you’ll see my-header is expanded. There is no client-side JavaScript running. In fact, we could just go right ahead and disable JavaScript and see this still works. It’s still snappy. It still does what it’s supposed to do. All of this is expanding the web components, server-side, which is important. There’s a custom element. There’s the links. If I go to these other pages like home, same difference. That’s really powerful and nice. We didn’t need client-side JavaScript to render a custom element. We got some reuse. We have really clear templates. We’re using just standards-based stuff right now. We’ve got standard, pure JavaScript, and standard HTML.

The next big trick for Enhance is to show how we do API routes. I’m going to add an API route for index. Similarly, to the file-based routes for pages, you can add API routes, as just names and have the map. I’ve got pages index html, let’s add api/index.mjs. API routes can respond to HTTP verbs. Export async function get, would respond to an HTTP get request. Likewise, if I wanted to do like a post, export async function post. My form is posting to index, this would get invoked, this function right here. Let’s do the get request first. The get request is going to return a bit of JSON. That JSON is going to have a key of stuff, and a value of an array with some scalar values. Very basic async function. Now, by itself, this doesn’t mean much. I could make an XMLHTTPRequest to index right now, and if I had a accept header of application JSON, it would return that value.

I’m going to show you something even cooler. I’m going to duplicate my custom element, my-header, and call it my-debug. I’m going to get rid of all of this. I’m going to change this to a very trivial debugger. This is just a regular tag template literal. I can use the dollar sign syntax to do interpolation. I’m going to JSON.stringify state. You might remember, when I was first talking about this, I said all the elements are pure functions that receive this HTML function and state, and then they return an HTML value. This state will get prepopulated by this index. If I now add, my-debug, and we can look, hi from index html, there’s nothing here. My-debug, say that. Socket didn’t load, but there we go. Now we’ve got it. This is the debugger component outputting the state that got parsed in, that state got parsed through. If I made an XHR request, I would invoke that lambda function again in the backend, which means that we can do progressive enhancement with the values that are not interpolated with HTML. That’s really nice. You can use that state to render stuff. We can use it to manipulate this page, or anything in our components. That’s very handy. There’s a whole lot more to show, Enhance works with forms. There’s a whole utility CSS system built in. We have CRUD generators. We can deploy this to AWS.

The Key Concepts of Enhance

Some key concepts for Enhance that I’d like you to take away. It’s file-based routing with just plain HTML. If you know HTML you know Enhance. It’s not like HTML, it is HTML. You can reuse markup across HTML pages with custom elements. It’s a pure function that returns the same thing every time. There’s a built-in utility CSS system that’s based on scales rather than absolute values. It’s going to work with responsive web design without having to compile a whole bunch of different versions of that CSS. I think it clocks in at around 20 to 30 kilobytes. We actually just inline it in the head of the document, you don’t even have to think about it. If you didn’t want to use the CSS, because you don’t like utility systems or whatever, it fully supports standards-based CSS. API routes are really nice. You don’t have to manually wire any props. Because of the way that API routes work, it’s very simple to progressively enhance this whole system with standard JavaScript, and no special syntax is required. Again, under the hood, this is a full stack dynamic web application. You don’t need spinners to display dynamic data. You can just render it. Enhance brings together both frontend and backend concepts, but it’s also a very HTML focused and standards-based focused. Our real driving force here is to bring some stability back to the ecosystem and just stop loading everything to JavaScript and hoping it’s just going to work. This is our vision for the future. Try it out at enhance.dev.

Questions and Answers

Dunphy: One of the key features that developers love from single page apps is the virtual DOM, and the ability to control stateful interactions. What is the response from Enhance to developers who love or perhaps require building with these features?

LeRoux: It’s a common way to approach building more interactive applications or more long-lived applications, maybe, apps that are going to have longer user sessions, sometimes you like to have all that functionality baked in at one key page. I actually don’t think there’s such a thing as a single page app. There’s always a few pages, and then there’s one main page. Nothing in Enhance is stopping you from embracing using any of the existing technologies out there to do that. If you want to embed a React app inside of it, you could do that. I think that’s totally appropriate for some cases of application. I would encourage most people, though, to not start there. I would start with the simplest thing that could possibly work, and then build up to that and see what you could do with just vanilla JavaScript. I think people would be very pleasantly surprised to discover that it has advanced quite a bit in the last 10 years.

Dunphy: Is this why you think maybe Remix is really sparking a lot of innovation in this space. I think the founders, Ryan Florence, and Michael Jackson, very bullish on Rails, very bullish on web standards. This is something that they’ve tried to bring into that framework. Is this something that you see as more in line with what you’re trying to do with Enhance, separate from other React frameworks like Next, and perhaps even Gatsby?

LeRoux: Gatsby is fine. Yes, I really admire what Ryan and Michael did with Remix and how fast they really executed on that. Now it’s a part of Shopify. I think it’s got a really great future ahead. Yes, we’re very compatible, philosophically. A place where we differ is really in the transpile step. I don’t think that’s necessary anymore, and has bad tradeoffs. I think those tradeoffs are really important if you’re building a business application. If you’re building up a stack blog or something, and you don’t mind your dependencies breaking, then that’s cool. If you’re a line of business application, you’re processing customer orders, or have perhaps governance and issues around stability, you’re going to want to stick as close to the metal and standards as you can. I think React is great. I think Remix is great. I think these tools serve a purpose. I think a lot of the reasons they came about no longer apply. I think it’s time to revisit that.

Dunphy: It is curious that Shopify did acquire them. It reminds me of a meetup we had featuring Alex Russell, noted React critic, in San Francisco. One of the things he pointed out was that React is extremely complex and error prone, specifically with e-commerce apps. He asked this question, who is having problems with React in e-commerce apps? A number of folks raised their hand. One person in the Q&A, did ask a question specifically about this. I’m not working directly with e-commerce apps, so it was an interesting data point for me to explore a little more. I’m wondering if the purchase of Remix is actually going to solve some problems that Shopify was experiencing on their own because they are very much a React shop.

LeRoux: Very interesting, because I feel like they get a lot of data. They have a lot of users and a lot of downstream users of their marketplace. They’ve bet big on React and so they want more skin in that game, I think. I imagine it’s in everybody’s interest to improve it and continue to make it better. I’m not sure if it’s complex or not. I think we make it complex. I think it actually is quite terse and beautiful, and really did move the state of the art forward for us. All credit to them and other frameworks like them like Svelte.

Dunphy: One of the things that makes React so popular is not just its feature set, but also its developer experience, with loosely held opinions and a rich ecosystem of tools to support virtually any use case. It’s an extremely popular tool to build with. At the same time, we’ve seen criticisms of React, and specifically its performance, and just general overuse in the community where it’s not required. Where do you think Enhance fits into the typical web developer stack these days? What is the sweet spot for Enhance?

LeRoux: I think it’s a first-mile solution. When you’re learning frontend, or you’re beginning a new project, you’re probably going to start with HTML, even if it’s a React app. What better way to do that than to actually start with HTML and start building up your application from first principles as opposed to like, diving in and trying to npm install your way to success. We see a lot of people with failed builds in begin.com, because they add so many dependencies, and then when we work with them in support, often many of those dependencies they’re not even using. They’ve got a lot of code in the hot path that’s just sitting there for no good reason. Then, the more of a dependency you have, the more brittle the situation gets, and it’s a House of Cards. For me, the sweet spot is when you’re getting started. You may have to eject at some point. It’s HTML, so you’re going to have a good time doing that. It’s not going to be hard. You already know HTML. Another thing that I like to bring up, people are like, what about the ecosystem? React’s got a big ecosystem, so does the web. The web is actually arguably the bigger of the two. You wouldn’t be able to do React if you didn’t know HTML, CSS, and JavaScript. You’ve already got those skills. It’s already there for you. It’s a good place to begin. It’s a good place to build up from. Because under the hood, it’s a functional web app, which means it’s been built with lambda functions. It’s going to scale up like really far. You’ll be able to build an application that can handle 10k requests per second, the first time you deploy it, and an application that talks to a real database, not a static.

See more presentations with transcripts

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Rider 2023.2 with C# Updates, UX/UI Enhancements and AI Assistant

MMS Founder
MMS Robert Krzaczynski

Article originally posted on InfoQ. Visit InfoQ

Rider 2023.2 is now generally available. This version contains improvements to C# language support. They are related to code readability and improve the programming experience. Further, there are some UI/UX enhancements. JetBrains presented also AI Assistant which for now is limited access. 

Rider 2023.2 introduces a number of improvements to C# language support, improving the programming experience for developers. One of the key new features is improved support for raw string literals with new inspections, contextual actions and improved typing assistance, making working with these literals smoother. For developers working with the Entity Framework, Rider now offers specialised inspections and quick fixes for common problems, improving debugging and increasing productivity.

Another feature is the focus on code readability. Two new inspections and corresponding quick fixes have been added to improve code clarity when handling local functions. In addition, Rider introduces inspections for #nullable directives and null-allowing reference type (NRT) annotations, simplifying the management of null-allowing types. Navigation becomes more intuitive with improved handling of var declarations, helping with code exploration and understanding.

Moreover, Rider takes advantage of the latest developments in the C# language, offering support for the main constructor for non-record classes and structures from the familiarisation version of C# 12. Default parameter values in lambda expressions provide flexibility in function definitions. The tool also introduces new code inspections, providing better control over object deletion and improved support for C# language rejection, improving code quality and reliability. These updates enable Rider to offer an efficient and user-friendly environment for C# developers.

The new release contains changes within UX/UI. There are several features, including colour-coded project navigation to distinguish between open projects easily. It is possible to customise the colours of the header and even set a custom icon for a solution. In addition, the main UI toolbar is now customisable, offering a drop-down menu to add preferred actions for easy access quickly. Managing run configurations has been simplified with the option to pin preferred configurations in the Run widget, improving project organisation. Other UI enhancements include a redesigned hamburger menu, a light theme with luminous headers, one-click navigation between project directories, sorting files by modification time in the Solution Explorer and updated window controls for macOS.

This release additionally adds a new feature to Rider with limited access called AI Assistant. It offers various AI-based functions that integrate seamlessly into the core workflows of the IDE. AI Assistant can analyse selected code, explain the meaning of validations or errors at runtime, generate documentation and create Unity files based on requirements.

Below one of the LinkedIn posts appeared a question:

Is the waiting list long for AI Assistant and does it play nicely with GitHub Copilot?

JetBrains answered that AI Assistant does not interfere with GitHub Copilot, and as for the waiting list, it is currently almost empty, so it is possible to join without difficulty.

For more information on all these features, there is an opportunity to review the full list of requests that JetBrains has addressed in this release cycle in their public bug tracking tool.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Direct VPC Egress for Cloud Run in Preview

MMS Founder
MMS Nsikan Essien

Article originally posted on InfoQ. Visit InfoQ

Google Cloud announced the preview release of Direct VPC egress for Cloud Run. The capability enables traffic from Cloud Run containers to access Virtual Private Cloud (VPC) networks without Serverless VPC Access connectors, allowing for cheaper connection routes with larger bandwidth.

Cloud Run is a fully managed container orchestration platform. Built on Knative, the service offers a serverless deployment environment for stateless microservices.

Historically, access to resources within a VPC Network from Google Cloud serverless environments has required the use of Serverless VPC Access connectors. The Access connectors allow traffic from services like Cloud Run, App Engine or Cloud Functions to enter the VPC without flowing through the public internet. This works by providing a fleet of managed virtual machines to proxy traffic to the relevant IP addresses within the VPC. While these virtual machines can provide a robust route into the network, they are billed per hour the instances are available, irrespective of their level of utilization, and add an extra hop in the traffic route. Additionally, once scaled up, Access Connectors do not scale down. Direct VPC egress is a newer approach that aims to overcome these drawbacks.

An illustration of VPC connectors proxying traffic from a Cloud Run Instance into a VPC (Source: Google Cloud News Blog Post)

With Direct VPC egress, Cloud Run instances get assigned IP addresses within the target VPC network and have their traffic routed directly. Additionally, Direct VPC egress acts as a firewall, only allowing connections initiated by the Cloud Run instance rather than from resources within the VPC. This allows a faster network path with greater throughput and reduces costs as the charges are only for the traffic rather than any virtual machine instances. The recommended deployment setup for this feature is into a subnet with 4 times as many unused IP addresses as Cloud Run instances.

An illustration of Direct VPC egress from a Cloud Run Instance into a VPC (Source: Google Cloud News Blog Post)

The feature, which is still in preview at the time of writing, has some limitations. A few of note are the instance limit of 100 and incompatibilities with Cloud NAT, VPC Flow Logs and Firewall Rules Logging. Additionally, as part of the preview release, the feature is only available in 5 regions: us-central1, us-east1, europe-west1, europe-west3 and asia-northeast1.

Feedback on the community has been positive with a user cabalos commenting on the r/googlecloud thread:

[We] started testing Direct VPC to replace Serverless VPC. We’re seeing massive latency improvements. On a read heavy app connecting to Cloud SQL and Memorystore, latency is cut in half.

Finally, further information on how to get started with Direct VPC Egress is available on its documentation page.

About the Author

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Traders Purchase High Volume of Call Options on MongoDB (NASDAQ:MDB)

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

MongoDB, Inc. (NASDAQ:MDBGet Free Report) was the recipient of unusually large options trading on Wednesday. Stock investors bought 36,130 call options on the stock. This is an increase of 2,077% compared to the typical volume of 1,660 call options.

MongoDB Price Performance

Shares of NASDAQ MDB opened at $382.26 on Thursday. The stock has a market cap of $26.98 billion, a PE ratio of -110.48 and a beta of 1.11. MongoDB has a fifty-two week low of $135.15 and a fifty-two week high of $439.00. The stock has a fifty day moving average of $390.04 and a 200-day moving average of $308.14. The company has a debt-to-equity ratio of 1.44, a quick ratio of 4.19 and a current ratio of 4.19.

Wall Street Analyst Weigh In

MDB has been the subject of several recent analyst reports. Capital One Financial initiated coverage on MongoDB in a report on Monday, June 26th. They issued an “equal weight” rating and a $396.00 target price for the company. Tigress Financial upped their target price on MongoDB from $365.00 to $490.00 in a report on Wednesday, June 28th. Canaccord Genuity Group increased their price objective on MongoDB from $410.00 to $450.00 and gave the company a “buy” rating in a report on Tuesday. UBS Group increased their price objective on MongoDB from $425.00 to $465.00 and gave the company a “buy” rating in a report on Friday, September 1st. Finally, Argus increased their price objective on MongoDB from $435.00 to $484.00 and gave the company a “buy” rating in a report on Tuesday. One research analyst has rated the stock with a sell rating, three have issued a hold rating and twenty-one have issued a buy rating to the company’s stock. Based on data from MarketBeat.com, the company has a consensus rating of “Moderate Buy” and an average target price of $418.08.

Check Out Our Latest Stock Analysis on MDB

Insider Transactions at MongoDB

In other news, CRO Cedric Pech sold 360 shares of the stock in a transaction that occurred on Monday, July 3rd. The stock was sold at an average price of $406.79, for a total value of $146,444.40. Following the completion of the sale, the executive now directly owns 37,156 shares of the company’s stock, valued at $15,114,689.24. The sale was disclosed in a document filed with the SEC, which is accessible through the SEC website. In other news, CRO Cedric Pech sold 360 shares of the stock in a transaction that occurred on Monday, July 3rd. The stock was sold at an average price of $406.79, for a total value of $146,444.40. Following the completion of the sale, the executive now directly owns 37,156 shares of the company’s stock, valued at $15,114,689.24. The sale was disclosed in a document filed with the SEC, which is accessible through the SEC website. Also, Director Hope F. Cochran sold 2,174 shares of the company’s stock in a transaction that occurred on Thursday, June 15th. The shares were sold at an average price of $373.19, for a total value of $811,315.06. Following the completion of the transaction, the director now directly owns 8,200 shares of the company’s stock, valued at $3,060,158. The disclosure for this sale can be found here. Insiders sold a total of 83,551 shares of company stock valued at $33,875,952 over the last ninety days. 4.80% of the stock is currently owned by insiders.

Institutional Investors Weigh In On MongoDB

Several large investors have recently added to or reduced their stakes in the business. Alamar Capital Management LLC boosted its stake in MongoDB by 2.4% during the second quarter. Alamar Capital Management LLC now owns 9,056 shares of the company’s stock valued at $3,722,000 after buying an additional 210 shares during the period. Osaic Holdings Inc. lifted its stake in MongoDB by 47.9% during the second quarter. Osaic Holdings Inc. now owns 14,324 shares of the company’s stock worth $5,876,000 after purchasing an additional 4,640 shares during the last quarter. Teachers Retirement System of The State of Kentucky lifted its stake in MongoDB by 365.9% during the second quarter. Teachers Retirement System of The State of Kentucky now owns 7,142 shares of the company’s stock worth $2,935,000 after purchasing an additional 5,609 shares during the last quarter. Coppell Advisory Solutions LLC bought a new stake in MongoDB during the second quarter worth about $43,000. Finally, Alliancebernstein L.P. lifted its stake in MongoDB by 62.6% during the second quarter. Alliancebernstein L.P. now owns 264,330 shares of the company’s stock worth $108,637,000 after purchasing an additional 101,804 shares during the last quarter. Institutional investors own 88.89% of the company’s stock.

MongoDB Company Profile

(Get Free Report)

MongoDB, Inc provides general purpose database platform worldwide. The company offers MongoDB Atlas, a hosted multi-cloud database-as-a-service solution; MongoDB Enterprise Advanced, a commercial database server for enterprise customers to run in the cloud, on-premise, or in a hybrid environment; and Community Server, a free-to-download version of its database, which includes the functionality that developers need to get started with MongoDB.

Read More



Receive News & Ratings for MongoDB Daily – Enter your email address below to receive a concise daily summary of the latest news and analysts’ ratings for MongoDB and related companies with MarketBeat.com’s FREE daily email newsletter.

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Stock Market Experiences Slight Downturn as Treasury Yields Recover – Motorblog Uruguay

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

Stock Market Experiences Slight Downturn as Treasury Yields Recover

On Tuesday, the stock market experienced a slight downturn due to the recovery of Treasury yields. However, major indices such as the Dow Jones and Nasdaq were not heavily affected due to the strong performance of megacap stocks like Microsoft, Meta Platforms, and Tesla. Nonetheless, weakness was observed in market breadth, and both the Dow Jones and Russell 2000 fell below their 50-day moving averages.

Streaming media company Roku announced on Wednesday that it would be cutting 10% of its staff. However, the company also raised its revenue projections for the third quarter, leading to an increase in its stock price before the market opened. Analysts had estimated lower revenues for the company, but Roku exceeded expectations.

Software companies Zscaler and Asana reported earnings on Tuesday evening, along with software developer GitLab. Despite posting better-than-expected earnings, Zscaler’s stock price slightly declined due to an uneven consolidation period. Asana’s stock price also fell after surpassing earnings estimates, while GitLab’s stock price unexpectedly rose with earnings and revenues above projections.

Meta stock, Microsoft stock, MongoDB stock, and Zscaler are nearing buy points and showing signs of potential growth. Meta stock is included in the IBD Leaderboard, while Microsoft’s stock is on the IBD Long-Term Leaders list. Both MongoDB and Zscaler stocks are on the IBD 50 list.

As for the outlook, Dow Jones futures were slightly below fair value on Wednesday. S&P 500 futures and Nasdaq 100 futures also experienced declines. The 10-year Treasury bond yield slightly fell to 1.25%, and crude oil prices also declined. Economic data, such as the ISM Services Index, is expected to be released throughout the day.

Despite the drop in futures, it is important to note that pre-market action does not always translate into actual trades in the regular stock market session.

Source: URL not provided.

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Insider Sell: Mongodb -Today at 04:26 pm – MarketScreener

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

MongoDB, Inc. is a developer data platform company. Its developer data platform is an integrated set of databases and related services that allow development teams to address the growing variety of modern application requirements. Its core offerings are MongoDB Atlas and MongoDB Enterprise Advanced. MongoDB Atlas is its managed multi-cloud database-as-a-service offering that includes an integrated set of database and related services. MongoDB Atlas provides customers with a managed offering that includes automated provisioning and healing, comprehensive system monitoring, managed backup and restore, default security and other features. MongoDB Enterprise Advanced is its self-managed commercial offering for enterprise customers that can run in the cloud, on-premises or in a hybrid environment. It provides professional services to its customers, including consulting and training. It has over 40,800 customers spanning a range of industries in more than 100 countries around the world.


More about the company

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Peering Into MongoDB’s Recent Short Interest – Benzinga

MMS Founder
MMS RSS

Posted on mongodb google news. Visit mongodb google news

MongoDB’s MDB short percent of float has risen 8.44% since its last report. The company recently reported that it has 4.27 million shares sold short, which is 7.07% of all regular shares that are available for trading. Based on its trading volume, it would take traders 3.12 days to cover their short positions on average.

Why Short Interest Matters

Short interest is the number of shares that have been sold short but have not yet been covered or closed out. Short selling is when a trader sells shares of a company they do not own, with the hope that the price will fall. Traders make money from short selling if the price of the stock falls and they lose if it rises.

Short interest is important to track because it can act as an indicator of market sentiment towards a particular stock. An increase in short interest can signal that investors have become more bearish, while a decrease in short interest can signal they have become more bullish.

See Also: List of the most shorted stocks

MongoDB Short Interest Graph (3 Months)

As you can see from the chart above the percentage of shares that are sold short for MongoDB has grown since its last report. This does not mean that the stock is going to fall in the near-term but traders should be aware that more shares are being shorted.

Comparing MongoDB’s Short Interest Against Its Peers

Peer comparison is a popular technique amongst analysts and investors for gauging how well a company is performing. A company’s peer is another company that has similar characteristics to it, such as industry, size, age, and financial structure. You can find a company’s peer group by reading its 10-K, proxy filing, or by doing your own similarity analysis.

According to Benzinga Pro, MongoDB’s peer group average for short interest as a percentage of float is 5.53%, which means the company has more short interest than most of its peers.

Did you know that increasing short interest can actually be bullish for a stock? This post by Benzinga Money explains how you can profit from it.

This article was generated by Benzinga’s automated content engine and was reviewed by an editor.

Article originally posted on mongodb google news. Visit mongodb google news

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.


Presentation: Effective and Efficient Observability with OpenTelemetry

MMS Founder
MMS Daniel Gomez Blanco

Article originally posted on InfoQ. Visit InfoQ

Transcript

Blanco: I’m Dan. I’m a Principal Engineer at Skyscanner. I want to talk about OpenTelemetry, and how it can help you deliver effective observability, and also help you do it efficiently within your organization. I want to start by discussing one of the key questions that observability helps to answer. That is, when our systems change, which could be because we deployed a new version of a component, or because our users are using it in a completely different way, how do we know what changed? Because our systems are a bit like black boxes, we send a request in, and we get a response out, but we have little information on what goes on inside the system to be able to serve that response. This is why we produce telemetry in the form of metrics, of traces, and logs, that gives us more information about what goes on inside a system in production.

It’s really easy to see how a change that we make to a script that we are debugging locally has the desired effect or not. We’ve all done this. We’ve all added print statements here and there, and in a very primitive way. That is some form of observability, because it does tell us something about the script execution. When we change it, we expect to see hopefully something different being printed. I think we would all agree that this doesn’t really scale. These print statements are not really going to get us very far, because our systems are not simple scripts that we debug locally. Our systems are complex distributed systems, with hundreds of services deployed and thousands of interconnections between them. What you see here is a representation of the service mesh at Skyscanner, and the service dependencies between them. When we deploy a change to one of these services, how do we know that change didn’t affect anything else apart from our service? How do we know it didn’t affect its dependencies upstream, or downstream dependencies. Most importantly, when something fails, how do we get to the root cause of that regression fast, because we can’t keep thinking about our services as if they were running in isolation when they run in a complex distributed system. For that we need observability. I would like to tell you how OpenTelemetry and open standards can help you achieve effective observability within your systems to be able to debug those regressions faster.

Background & Outline

I joined Skyscanner in 2018, originally to work on performance and resource optimization. Since 2020, I’ve been leading a really exciting project to rely on open standards and OpenTelemetry for telemetry instrumentation, and to improve the observability of our systems to allow us to detect and debug incidents faster in production. For the last 12 years, I’ve spent my time working as a platform engineer in organizations from as small as 5 employees and bigger than 2500 employees, always working to reduce the cognitive loads and the toil that it takes for teams to operate their service in production. In the last few months, I’ve written a book called “Practical OpenTelemetry” that discusses some of the topics that we’ll be talking about. We will cover why observability is important without the incident response lifecycle. We’ll cover how open standards can help to deliver that effective observability. How to roll out OpenTelemetry efficiently within your organization. Also, how to make sure that telemetry signals remain valuable and are used within your organization as they should be.

Why Observability Matters

We’ve seen that observability helps answer that question of what changed. That’s important in many occasions, but especially when something goes wrong, when we apply a change and it didn’t go according to plan. What you see here are some of the key metrics during the incident response lifecycle. Hopefully, we are familiar with some of them, like mean time to detect or mean time to recovery. What I tried to add here as well is mean time to resolution as a metric that includes the time that it takes for us to be able to deploy a change, and to make sure that that change fixes the original regression. Observability helps in two different ways here. The first one is to answer the question, is my system behaving as expected? That involves, one, the time that it takes to detect an incident, and then hopefully fire an automated alert. Then, to reduce the time that it takes to verify that effects that were deployed to production has the desired effect, and to do that with evidence.

In the last decade, the way that we instrument services has changed, and is now easier than ever with open source tooling. It’s easier than ever to produce metrics and to integrate those metrics into dashboards and alerts, to really measure what’s important to our users, what’s important to our customers, and be able to react to regressions of those key performance indicators as fast as possible. This is really important, because that is when we deploy services hundreds of times a day, we need to be able to detect that fast so we can roll back the changes even faster. This is a healthy metric of an organization. If you’re able to deploy faster and recover faster, is a metric of high velocity teams within organizations. Observability also helps answer a different question, which is, when an alert is fired, why is my system not behaving as expected? It helps us to reduce what we call the mean time to know from when the alert is fired to when the root cause is found. Even though things have changed dramatically in the other areas of observability, nothing has changed that much in how we debug our systems in production. We still treat our services as if they were running alone, rather than within a complex distributed system.

Let me give you an example. Let’s put like service owner hat on. We have a service here that is instrumented with some custom metrics. We’re measuring the number of 500 responses that are returned by that service to our users. This service has a dependency on a different service to obtain some data and then render it. In this case, when the number of 500 responses go over a certain threshold, an alert fires. The usual traditional incident response will basically tell our engineer on-call to go and follow a particular runbook. That runbook tells that engineer to go and look at a particular dashboard, to try to identify metrics that could be correlated to that increase in 500 responses. This relies on past experience. It relies on known failure modes of the application. For example, it may be memory saturation so the service will start to apply backpressure. Our engineer will try to manually correlate those, or try to see if something moves in the same direction. They may also need to go to our logging backend and ask for some particular error codes or error cases. These are normally things that we’ve seen before and we can search for them.

Then, in these two cases, they both rely on past experience. How do we know that they’re not other metrics that could correlate to this particular regression, and they’re not in our dashboards? Or how do we know that the error messages that we’re looking for are the ones that are being emitted by the application or by a particular service replica, that is returning those 500 response codes. These error messages could also be background noise, could also be always there and not really be related to the root of regression. Even if they are, let’s say, in this case, we find that the service where we would get data from has no data to render. Then, what do we do? Do we call another service owner? That’s normally what happens, incident calls where we call a separate service owner, and then they start investigating using their own runbooks and using their own dashboards. Then they may find the same conclusion that the root cause is not in their service. This adds time to the incident response and to that time to know metric.

Let’s look at the same example, but relying on context rather than experience. In this case, we can have a service that’s instrumented with OpenTelemetry, and has the same metric of number of 503 responses, for example, but is using open standards, is using naming conventions like the name of the metric, or the attributes of that particular metric. An observability platform that supports these semantic conventions can assign semantics to that, but it knows that that’s one of the golden signals. Then it can then correlate that to memory utilization metrics, for example, and automatically tell us what instance is the one that is having problems. A service instrumented with OpenTelemetry could also link to individual distributed traces, using what’s called exemplars, which are individual examples from within a service replica that link to the transactions that were going through that system, when, for example, a high number of 500s was being recorded.

In a distributed trace, we can see that high granularity data, and we can see that, not only from my service, but as well from the dependency. We can see in one go that the error seems to be within the dependency. Then OpenTelemetry can also help to correlate those using trace IDs that are, in Java, for example, part of the ThreadLocal storage. That can be correlated using things like MDC, to your legacy application logs, that perhaps were not instrumented with OpenTelemetry but can still be correlated to that particular trace. We know that that transaction that went through the system, we get to see the logs not only from our service, but also from other services within that same transaction. In one go, we can see that the root of the regression was in our dependency, and that will allow us to investigate it further. Here, we’re relying on context and correlation, not on experience, to debug a particular system. This is something that I occasionally do at Skyscanner. I may use one of our observability platforms, and then try to find these correlations and try to find the root cause for regressions. Not often, but sometimes I have found that I get to the same investigation as service owners without having a clue of how the system operates. Sometimes I even may bring some information to the table that service owners may not have, because they were not using the same correlation or some of the OpenTelemetry signals.

Effective observability requires a few things. It requires that high granularity of the detailed telemetry from within operations that are happening in individual transactions through a distributed system. We need context that ties that all together, all the signals and all the services as part of a holistic view. That needs a couple of things. It needs that signal correlation, so we can get metrics, traces, and logs as part of the same context. We need service correlation, so we can identify these dependencies between services and see how changes in one set of service may affect another. For this to work, we need open standards. We cannot refer to, for example, the trace ID, or we cannot refer to a service ID or a service name in a particular way depend on each organization because it’s not efficient from the point of view of integrating with open source tooling with observability vendors. We need those open standards to be able to provide telemetry out of the box, and for vendors to support these semantics.

How Open Standards Help Observability

We’ve seen why observability matters and how does OpenTelemetry help. OpenTelemetry’s mission statement is to enable that effective observability that we’ve seen by making high quality portable telemetry, ubiquitous. It does that in a way that it puts the responsibility of instrumenting a service or instrumenting a particular library in the hands of the person that knows the most about it, which could be the library author or the service owner, without being tied to any implementation details. Let me explain that in a bit more detail. I’ll go down to the API design of OpenTelemetry now for a bit, and then we’ll go back to some of the more high-level concepts. This is what an application instrumented with OpenTelemetry looks like. We’ve got clear distinction between what are called cross-cutting packages and self-contained packages. The OpenTelemetry API, for example, provides public interfaces, and just a minimal implementation for the different telemetry signals. We’ve got metrics. We’ve got tracing. We’ve got baggage. We’ve got logging. For each of these signals, it provides pretty much a normally and No-Op implementation of them. It also provides context that allows these signals to all be part of the same context that ties them together.

Application owners or whoever instruments a particular library or a service, they can rely on these APIs without being tied to an implementation. This allows them to take long-term dependencies. OpenTelemetry provides very strong stability guarantees and APIs that are always going to be backward compatible, so service owners can rely on them. Then, when they configure the OpenTelemetry SDK, they can decide how they want their metrics, or the logging, or the tracing to be collected, and to be exported from within a particular application. These OpenTelemetry SDKs for all the signals can also be extended by using plugins. These plugins allow us to integrate with different open source tooling, for example, or other observability platforms to be able to, for example, export data in a particular format. All that can be configured in only one place. For example, if you want to change the telemetry backend from Prometheus to a different one, we can do that without affecting how our applications are instrumented, without having to change any application code, only where we configure the OpenTelemetry SDK.

These contrib packages that are open source packages also provide what are called instrumentation packages. These provide that out-of-the-box telemetry, out of hundreds of different open source libraries and different languages. For us, it’s quite important, because this is one of the areas where we want to remove the responsibility from service owners, to having to instrument their services. Relying on these instrumentation packages means that we can reduce, one, the toil that it takes to instrument services, and also to maintain it, because as libraries evolve, the instrumentation has to evolve with them. Relying on these packages allows us to offload that to telemetry experts that instrumented those libraries. Last but not least, is the semantic conventions that you see there. Semantic conventions allow us to decorate telemetry with properties and attributes that follow some common naming. I think we’ve all been there in trying to say how do we define, for example, the AWS region or the cloud region for a particular metric. Before we started to use OpenTelemetry at Skyscanner, we had multiple ways of doing this, could be cloud.region, could be aws.region. It could even be data center before we migrated to the cloud. Now with OpenTelemetry, we’ve got one way of doing that, and it comes as a package that we can use across our applications. The good news about this is that it’s also supported by open source tooling and observability vendors to provide out-of-the-box correlation and out-of-the-box analysis from within these signals.

That’s what influenced as well our buy versus build decision at Skyscanner. When we think about a vendor, and the value that vendor provided before OpenTelemetry, most of them relied on their own instrumentation agents, and their own APIs and protocols. This is something that we were not very keen on at Skyscanner, to basically lock ourselves to a particular vendor at that layer, at the instrumentation and export and transport layer, because it meant that we couldn’t move between open source solutions. It also meant that we were in a way limited by whatever that vendor integrated with, from the point of view of open source libraries that they worked with. With OpenTelemetry, things changed dramatically, because now we can use open source for our instrumentation. We can use open standards and open standard protocols for the export and transport of telemetry data. Then we can rely on vendors for the parts where they actually deliver value, which is, storage and querying that analysis and correlation between telemetry signals using the same semantic conventions. Then, of course, the dashboards and alerts that were on top of that.

Rolling Out OpenTelemetry

Now that we’ve seen how OpenTelemetry and open standards can help, let’s go through how you can roll OpenTelemetry efficiently within your organization. This is one of the guiding principles for platform engineering at Skyscanner. This is to make the golden path, the path of least resistance. When we’re thinking about rolling out an observability strategy, there are certain things that we need to decide. For example, what format are we going to be collecting metrics, or exporting metrics? What is the aggregation level? What are the aggregation intervals? Things like that, that are basically some standards that we would like to be adopted across the company. One way of doing that would be to basically have those in a list, and then basically requiring service owners to implement it themselves. Another way, which is the one that we take, is to give service owners an easy way of applying these best practices. The way that we do that is using internal libraries that every single service at Skyscanner uses. These libraries, they configure multiple things, not just telemetry. They do security, networking, plenty of other things. Within these libraries, we can configure how we want the OpenTelemetry SDK that we saw before to collect and to export telemetry data. This basically allows us to execute our observability strategy with minimal friction for service owners.

Let me take you on a journey of simplification at Skyscanner. What this slide shows is the complexity of the telemetry pipelines and the telemetry tooling at Skyscanner before we started to rely on open standards, and before we started to rely on OpenTelemetry. It was a very complex system. The worst part of it is that it was not a very usable one. We had one vendor for synthetics, one vendor for browser edge, for RAM, metrics. We had another vendor for tracing. Then, a bunch of open source tooling internally and telemetry backends. Each one of them would basically be isolated. Service owners would just have to go to one place for logs and another place or two other places for metrics, and it just didn’t really provide definitely that effective observability that we needed. The semantic conventions were completely domain specific, completely custom made to Skyscanner. When we started our journey, sometimes we had to integrate with vendor provided software, in a way that our services never depended on the particular service and software, but we were still trying to aim for those open standards and semantic conventions. When we started to use OpenTelemetry, we started to simplify our backend using other open standards to also integrate with these vendors.

This is where we are at the moment, where our applications depend on the OpenTelemetry API, our backend applications depend on the OpenTelemetry API. We use OpenTelemetry Collector in agent mode, to be able to extract information from our infrastructure, and from our Kubernetes clusters. Then we feed that information through OpenTelemetry Collectors as a gateway to integrate with our third-party vendor. This is not the end state for us. We believe that the future will rely more on OpenTelemetry, and it will be even more simple from the point of view of instrumentation. We see that any browser-side, mobile-side, or backend will depend on the OpenTelemetry API in different ways. We’ll start to rely on OpenTelemetry Collectors for anything that is related to collecting information from infrastructure. Then, all fed through an OpenTelemetry Collector gateway that allows us to control how we integrate with a vendor, and is the last hop of telemetry. This is important as well, because feeding all that through collectors allows us to control that last hop of telemetry, and made better use of resources or networking, and also be able to control things like authentication, or if we want to transform telemetry in a particular way, we can do it. Even when we integrate with cloud provider endpoints, we want to rely on OpenTelemetry protocols and open standards to be able to integrate with all the vendors. You can see the simplification that one can achieve by using OpenTelemetry in the instrumentation and export layer, and the transport and processing while relying on vendors for the storage, querying, and the UI, and alerts.

Another area where we capitalized on the use of open standards was our migration from OpenTracing to OpenTelemetry. As you probably know, OpenTelemetry is a merger between OpenTracing and OpenCensus, two projects that were popular before OpenTelemetry, and then that are deprecated. At Skyscanner, we were big users of OpenTracing across all of our stack. OpenTracing had a similar API design to OpenTelemetry. As I said, there is an OpenTracing API with no implementation, and then when the application starts up, we configure the implementation from that API. With OpenTelemetry, as there is compatibility with those previous projects, we can use what’s called the OpenTelemetry or the OpenTracing shim from OpenTelemetry that basically acts as an implementation for OpenTracing. Then, that relays calls to the OpenTelemetry API. What that meant for us was that we could start to roll out OpenTelemetry under the hood while applications that rely on OpenTracing could still rely on OpenTracing. Any instrumented middleware or an instrumented HTTP or gRPC client could still use OpenTracing, while service owners were gradually being moved to rely natively on OpenTelemetry, which is our current state. That meant that we could start to produce data with OpenTelemetry protocols, and could start to propagate trace contexts with OpenTelemetry format.

What did that mean? We roll out changes at Skyscanner as part of our internal libraries. It does pay off when you work in platform engineering. What you see here is our adoption of OpenTelemetry within Skyscanner, and how many services were sending telemetry to those OpenTelemetry Collectors. We went from an early adoption phase with 10 to 15 services, and then when we released our libraries publicly within Skyscanner, we saw that jump from those 15 services to over 130 services in a matter of 4 or 5 days. That is one hell of a curve of tech adoption. We’re quite happy about that. Now we’ve got hundreds of services being instrumented natively with OpenTelemetry. We send all that data through collectors, and they are incredibly powerful. We receive data in multiple formats, OTLP being the major one, but we also do some Zipkin, and Prometheus. OpenTelemetry Collectors can receive that data, and then work with it in some way using processors. They can remove unwanted attributes. They can rename attributes. They can change span status, if we need them. We can even generate metrics from spans. That allowed us to upgrade Istio without relying on Mixer, but just getting the spans from Envoy in Zipkin format and generating the metrics from it. We explored that data in OTLP, and as well, Prometheus for internal usage. They are incredibly efficient as well. We generate more than 1.8 million spans per second, that’s across 90,000 traces per second. They do all this with less than 125 cores being used across all of our clusters, and with less than 100 replicas in total. Incredibly useful tooling here.

Adopting Observability in Practice

Now that we’ve seen how we can roll out OpenTelemetry, I’d like to take you through some steps that you can take to basically make sure that you can keep telemetry valuable within your organization. Because the reality is that most data that we gather for debugging purposes is never used. Before OpenTelemetry, when basically we were using metrics and logs, most of the time, we found that basically the logs that have been stored, they normally correspond to requests that are successful in a way. They return in an acceptable response time, or an expected response time, and they don’t contain any errors. We still had to keep those logs. Same with metrics, we found that metrics that were being generated with some really high granularity attributes, because service owners were not using tracing to debug, they were using metrics to debug regressions. We’ve seen how OpenTelemetry can help you use the right tool for the right job. When you’ve got metrics that are low cardinality, and low volume, but they can link to traces, and those distributed traces can be sampled in a much better way that you could sample logging.

Let’s consider this case, for example, we’ve got on the left a distributed trace that goes through multiple services. If you were to sample logs, you can only sample logs by looking at an individual log record. You can decide to maybe store 10% of the debug logs and maybe 100% of the errors. Then, those debug logs can be crucial to identify regression. Then, what ends up happening is that people store all the debug logs, and then become quite costly from the point of view of storage and transport. With distributed tracing, we have better ways of being able to keep the useful data and then discard the rest. On the example on the left, we’re using what’s called probability sampling. This means that we decide if we want to keep a span or not, we want to sample a span or not, depending on its properties, or the propagated trace context that comes with it. For example, here, service A starts a trace, and decides to sample the whole trace depending on the trace ID. It decides to sample the span, and then it propagates that decision downstream. We’ve got the child span, for example, here that says if my parent span was sampled, then I respect that decision and I’ll sample it myself. When we propagate that to another service that may be using a different type of sampling, that service can basically say, if this trace has already been sampled, then I will store all the spans for this particular trace. This allows us to have one complete view of distributed transactions without having to keep every single one of them. This is simple to configure because it doesn’t require any external components. It does have one downside, that is that we’re looking at a percentage of the traces being sampled, and we can’t really identify which ones are the good ones or the bad ones.

With tail-based sampling, on the other hand, we can have a look at the whole trace. It is more powerful but it also requires external components. It requires all the spans for one particular trace to be fed through the same replica so it can be kept in memory. The way it works is, when you receive the first span for a trace, you start storing all the spans for that particular trace in memory. Then you wait for some time. That can be configured in multiple ways. Then, at some point, you need to make a decision if you want to keep this trace, or not. You can look at the whole trace, and you can see, is this trace slower than normal, so then we’ll keep it? Or, does this trace contain any errors in any of the individual operations, then we’ll keep it? Then allows for a more insightful way of keeping data, of sampling data, but it does require an external component. Normally, that could be an OpenTelemetry Collector, where you can send all the data. There are different ways where you can route traces to particular collectors. Or, you can use a vendor. There are multiple vendors out there that provide this capability to do tail-based sampling. This, at Skyscanner, allows us to store about only 4.5% of all our traces. What we do here is we’re storing the ones that matter, the ones that are slower than usual, or the ones that contain errors. Then we store a random percentage of the rest. You can see how we’re just keeping the valuable data and reducing costs in these ways.

When service owners come to instrument their services, they can sometimes add a lot of cost and a lot of the load to telemetry systems. As platform engineers, we’ve got two main ways to deal with this. One is the way of limiting. We can have controls on how service owners are allowed to add telemetry to their systems. For example, to add an instrumentation package, or to add a new custom metric, they create a request, and then, basically, another team goes and puts that into another list. Then you end up being able to do that. It generally doesn’t work. It slows down team velocity because they’ll be blocked on another team to allow them to produce telemetry. It generates toil for telemetry admins as well to add that exception to a rule. Then, it generally falls out of date soon. There could be a metric that you instrumented last year, that was crucial for your service, but now the service evolved and is no longer valuable but still there incurring costs. What works better is to put data in front of people, and to visualize that cost or that load in the telemetry backends and systems, and encouraging a good use of telemetry signals.

Here, OpenTelemetry can also help, because it allows us to segment data using semantic conventions. We’ve seen how every single event, or log, or metric, span, it has to be annotated with the service name, for example, and optionally, the service namespace, which is a way to group multiple services together. Then we can split that data, and look at, for example, storage cost, or storage volume, or cardinality for each of the services. Then we can assign cost to teams. When teams start to review this, when they review the telemetry cost, close to other costs, like, for example, cloud provider costs, they start to be proactive about this. We’ve seen that internally. We’ve seen teams that they start to look at telemetry in a way that, are we actually using the right signal to instrument our services? In some cases, we’ve seen teams that just by moving away from debug level logging, and into tracing, they have saved more than 90% of their telemetry costs. We’re rewarding that learning to use the right signal, the right tool for the right job. We’re also making sure that the telemetry that we’re using is the best that we can. That also enables product health.

Another area where we can learn from our failures, is during the incident post-mortem, and discussing those learnings. This is one of my favorite quotes from Einstein, that is, failure is success in progress. We should all be familiar here with the learnings that one can get from post-mortems, of sharing those across the organization and sometimes outside your organization. We’re normally focused on learning from it from the point of view of improving the resiliency of the systems, improving the reliability, but not always from the point of view of improving the observability of our systems, especially when we think about the system as a whole. We can foster that learning and improvement culture by following some steps. The first one is to establish those targets for time-to-detection, and time-to-resolve. It’s quite important because when those are not met, we can start to find areas of improvement, that could be looking at new telemetry that we could add, new instrumentation packages. We could make sure that service owners are using the right tool to debug their services, maybe their dashboards, or maybe their runbooks did not even mention looking at distributed traces, for example.

It’s good to encourage certain observability champions within your organization to join these post-mortems, and to provide that feedback. To say, actually, did you know that maybe you didn’t know but you’ve got tracing enabled by default? We’ve seen this happening where service owners did not know that they were not making or they knew that there was tracing, but they didn’t know how to use it. Having these observability champions helps to bring that to attention. Also, having a guild or a chapter, or some form of group of people across a company, across an organization where you can, not just gather external feedback, but also share learnings, share these post-mortems, share news about observability, new features, and so on. The last thing, and I think is quite valuable, and something that is sometimes overlooked, is how telemetry and how observability can just help teams understand their systems outside of the incident lifecycle. When you get two teams in one room that are part of the same system, and that their traces will be going through some of their services, what we’ve seen is that that allows them to identify usage patterns they may not know that were there. For example, a particular dependency or a particular endpoint that’s being used that they didn’t know it was being used. Being able to have those sessions where teams can evaluate that telemetry together and can improve, one, the telemetry that they produce and also the system in some way, is quite important.

Key Takeaways

The first takeaway is that complex systems require effective observability. We can no longer just pretend that we can debug our systems looking at individual services and looking at telemetry signals, as isolated events. We’ve seen as well how open standards and OpenTelemetry can empower organizations to simplify their infrastructure, to simplify their telemetry tooling, while integrating with vendors and with other open source platforms as well. Also, how OpenTelemetry enables signals to be used efficiently. When we use the right signal, or the right tool for the right job, we’re not just improving observability but we may also be reducing cost and reducing the operational toil and the cognitive load to operate our services.

See more presentations with transcripts

Subscribe for MMS Newsletter

By signing up, you will receive updates about our latest information.

  • This field is for validation purposes and should be left unchanged.