MuleSoft https://www.avioconsulting.com/blog%3Fbid%3D332 en Documentation - You'll Thank Yourself Later https://www.avioconsulting.com/blog/documentation-youll-thank-yourself-later <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/documentation-youll-thank-yourself-later" hreflang="en">Documentation - You&#039;ll Thank Yourself Later</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>Documentation. Hardly anybody wants to write it, but it is one of the most important deliverables in a software project. Without documentation, it becomes very difficult to understand why things were done the way they were and if the project is operating as expected. </p> <p>I have joined several projects where there was a lack of documentation. Sometimes you’ll be blessed with comments, but, in my experience, the only comments to be found are commented-out code. In Oracle SOA/BPM projects and Mulesoft projects, documentation is even rarer than in other projects. I’m not perfect - I’ve contributed to this problem as well. I’ve completed some code for a project and then, a month later, had to come back to the same code and figure out what the code is supposed to be doing in order to make modifications. Many developers will tell you the “code is self-documenting”, but the code doesn't show you the intent. In order to ascertain intent, one must consult documentation or requirements, and it isn’t always clear which code fulfills which requirements.</p> <p><img alt="Commented Code" data-entity-type="file" data-entity-uuid="43364b49-d141-484b-b9f0-16cc483e2808" height="131" src="/sites/default/files/inline-images/Screen%20Shot%202019-01-07%20at%201.20.40%20PM.png" width="655" class="align-left" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>We are all better than this!</p> <p> </p> <p><img alt="Mulesoft Notes Field" data-entity-type="file" data-entity-uuid="c0233439-8a75-4080-9dba-1d4fc57a2f2e" height="330" src="/sites/default/files/inline-images/Screen%20Shot%202019-01-04%20at%203.47.00%20PM.png" width="652" /><img alt="Oracle Documentation" data-entity-type="file" data-entity-uuid="99c29f98-1b67-41ac-a57a-955eb78665b5" height="256" src="/sites/default/files/inline-images/Screen%20Shot%202019-01-04%20at%203.44.24%20PM.png" width="505" /></p> <p>Save your colleagues and yourself some unnecessary time and document your code. It is possible to figure out what a chunk of code is supposed to do, but it takes much less time to read a sentence that says what the code is meant to do. The comment doesn’t have to be extremely detailed, it just needs to express the general idea. Put a comment in your Java code, fill in the Description field in your BPMN or BPEL activities, or write something in that Notes attribute on your Mulesoft message processors. Don’t leave the comments blank - you will thank yourself later!</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=738&amp;2=comment_node_blog&amp;3=comment_node_blog" token="Xxgpqfan-pc6CC8yR5FIbxX217LJ64swBJCwEYY6THI"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog/categories/adf" hreflang="en">ADF</a></div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> <div><a href="/taxonomy/term/365" hreflang="en">Oracle</a></div> <div><a href="/blog/categories/bpm" hreflang="en">BPM</a></div> <div><a href="/blog/categories/soa" hreflang="en">SOA</a></div> <div><a href="/blog/categories/other" hreflang="en">Other</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Mon, 07 Jan 2019 19:38:32 +0000 Adam Mead 738 at https://www.avioconsulting.com Mule CloudHub Logging with Custom Logger and ELK https://www.avioconsulting.com/blog/mule-cloudhub-logging-custom-logger-and-elk <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2018-11/Screen%20Shot%202018-11-28%20at%2012.13.01%20AM.png" width="2542" height="1868" alt="Mule-ELK" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/mule-cloudhub-logging-custom-logger-and-elk" hreflang="en">Mule CloudHub Logging with Custom Logger and ELK</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h2 dir="ltr"><strong>Objective:</strong></h2> <p>The objective here is to share a Robust, Consistent logging solution for Mule Cloudhub apps that are easy to maintain, visualize and track down software bugs or production issues quickly.</p> <p>Logging is a powerful aid for understanding and debugging programs run-time behavior. Logs capture and persist important data and make it available for analysis at any point in time.</p> <p>This article deals with creating a logging framework for MuleSoft apps that will suit any enterprise which is concerned about consistent and structured logging, zero log message loss and log analyzing.</p> <h2>Logging in CloudHub:</h2> <p>We don’t need to be concerned with the logging configuration inside Mule apps when we choose to deploy them to CloudHub. CloudHub writes all the logs to the console, provides a way to search by keyword and by the level and gives us an ability to change applications root log level on the fly, and to switch to debug mode and such.</p> <h3>So, why not use CloudHub’s default logging then?</h3> <p dir="ltr">Whenever Mule apps are deployed to CloudHub, logging capabilities can quickly become very limited in terms of visibility, persistence etc. especially when you have large amounts of logs that are generated by applications. Here are some things that you have to keep in mind before considering default CloudHub logging as your long-term thing.</p> <ul dir="ltr"><li>Persists logs only up to 100 MB or 30 days whichever comes first.</li> <li>After you delete applications, you lose all logs of that application.</li> <li>The only way to see logs is by logging into Anypoint platform and see CloudHub console per application.</li> <li>Cannot ship logs to your desired system easily, they can only be accessed via the REST API.</li> <li>No single place to analyze all your applications logs especially if you have API-led architecture. This can help to take some preventive measures.</li> </ul><h3><strong>So...</strong></h3> <ul dir="ltr"><li>We need a logging framework that can generate logs in a consistent and structured manner.</li> <li>Use any external log analyzer like ELK and feed all the logs to it to analyze your data in the most efficient way.</li> </ul><h3>First things first.</h3> <ul><li>Raise a support ticket with MuleSoft to disable CloudHub logging.  This is the setting that MuleSoft team has to do to in order for you to override the default CloudHub log4j2 configuration with your own custom application configuration.</li> <li>Setup Elastic stack(E.L.K) to analyze log data. Two things to consider here. <ul><li>As those three products are open source, you can use this <a href="https://elk-docker.readthedocs.io/">docker image</a> to set up your own environment and maintain all the configurations, deployments, disaster recovery, security, backup etc.</li> <li>There is a company called <a href="https://www.elastic.co/">elastic.co</a> which takes care of all the pain in managing instances, disaster recovery, backup etc. and they provide a way to set up stack on-premise or on their managed cloud.</li> </ul></li> </ul><pre dir="ltr"> <strong>Note: </strong>You will lose the ability to change application’s root log level on the fly when you disabled default CloudHub logging.</pre> <h2>Design a Custom logger for your Mule applications:</h2> <p>The default Mule logger is simple to use for logging but can be too simple because it doesn’t enforce any standards or best practices.  It also doesn’t provide a way to generate structured or consistent log messages. Designing a custom logger is the best solution here to generate structured logs and to enforce standards on the log data to be generated and of course, for seamless developer usage. The idea of this module should be to generate consistently structured logs in JSON format.</p> <p>It would be very good to provide a mule custom module for a developer to use for logging, requires specific information, and also be extended with additional information as key-value pairs, to log at a certain point, in a neat GUI. Then it’s the custom module’s job to take all the information, convert that data to JSON and log.</p> <p dir="ltr">Here is the look of Generic Mule Custom Logger developed by AVIO to use for any log purposes.</p> <p dir="ltr"><img alt="AVIO Logger" data-entity-type="file" data-entity-uuid="e5e3fe42-fedc-4010-984d-028b798af559" src="/sites/default/files/inline-images/Screen%20Shot%202018-11-28%20at%209.41.52%20PM.png" /></p> <p dir="ltr">And this module will produce a JSON like this</p> <table><colgroup></colgroup><tbody><tr><td> <p dir="ltr">{<br />    "timestamp": "2018-11-15T14:27:54.740-06:00[America/Chicago]",<br />    "request_id": "6c133127-35c7-4c84-93a0-c206ef4fbeb8",<br />    "app_name": "some-system-api",<br />    "app_version": "1.0.0",<br />    "env": "dev",<br />    "payload":"",<br />    "log": {<br />        "message": "This is my log message",<br />        "level": "INFO",<br />        "category": "com.lamar.avio" <br />    },<br />    "extended": {<br />        "myCustomKey1": "myValue1",<br />        "myCustonKey2": "myValue2"<br />    },<br />    "exception": {<br />        "detail": "Unhandled exception occured",<br />        "status_code": "500",<br />        "type": "APIKIT-UNKNOWN"<br />    }<br /> }</p> </td> </tr></tbody></table><p>This logger has been open-sourced under BSD 2-Clause "Simplified" License in GitHub. You can find it <a href="https://github.com/avioconsulting/mule-custom-logger">here</a>.</p> <p>We now have to feed this JSON to the ELK stack where Logstash will read this JSON message, parse it and ships to elasticsearch. Here is the high-level overview of ELK Stack. Now we have a great UI and a mechanism to generate logs in a consistent structured manner.  Also if we ever need to change the implementation of how and where we are logging to, the custom module can be updated and each project simply needs to update to the latest version of the module.</p> <p dir="ltr"><img src="https://lh6.googleusercontent.com/PhuGjzxicTZkcrrmYDvoJLIBlIEsjvdKaBoUeec1gYiQU6Xg7pimtNMFR_RSzua9WvxS6ExuMVRZh181MxEvbns1XuyxHLPBCxh57vrohQRteKDEN-Ee6d67lXGNusPhZPHsGEPn" /></p> <p>When you disabled CloudHub logging for an application, There are multiple ways to ship logs from CloudHub to any external system(Logstash in our case). Here are some.</p> <ul dir="ltr"><li>Use Log4j2 appenders like socket appender to post all logs to a specified destination.</li> <li>Use MuleSoft provided <a href="https://anypoint.mulesoft.com/exchange/portals/anypoint-platform/f1e97bc6-315a-4490-82a7-23abe036327a.anypoint-platform/cloudhub-api/1.0.5/pages/home/">CloudHub API</a> to retrieve logs periodically and send to your destination.</li> <li> <div>[Recommended]: Use a log4j2 appender to push all your CloudHub logs to Amazon SQS queue and have Logstash read messages from it. This way, we can scale SQS queue for high availability when there is huge log flow and we can ensure zero log message loss from CloudHub to Logstash as there is a highly scalable queue in between. <a href="https://github.com/avioconsulting/log4j2-sqs-appender">Here is the code</a> for the custom log4j2 appender to push all application logs to AWS SQS queue.</div> </li> </ul><h3>Logstash Pipeline:</h3> <p>Considering that you have <a href="https://www.elastic.co/guide/en/logstash/current/setup-logstash.html">Logstash setup</a>, you can write pipelines in Logstash to read messages from the queue, parse them and send to elasticsearch.</p> <p dir="ltr">Here is an example of Logstash pipeline that reads a message from AWS SQS queue, parses each message and send to elastic to store.</p> <table><colgroup></colgroup><tbody><tr><td> <p dir="ltr">input {<br />  sqs {<br />    id =&gt; "mule-sqs"<br />    access_key_id =&gt; "&lt;&lt;aws-access-key&gt;&gt;"<br />    secret_access_key =&gt; "&lt;&lt;aws-secret&gt;&gt;"<br />    id_field =&gt; "sqs.id"<br />    md5_field =&gt; "sqs.md5"<br />    sent_timestamp_field =&gt; "sqs.sent_time"<br />    polling_frequency =&gt; 5<br />    queue =&gt; "&lt;&lt;sqs-queue-name&gt;&gt;"<br />    region =&gt; "&lt;&lt;aws-region&gt;&gt;"<br />    codec =&gt; "plain"<br />  }<br /> }<br /><br /> filter {<br />  grok {<br />    match =&gt; {<br />      message =&gt; "%{WORD}%{SPACE}%{TIMESTAMP_ISO8601:logdate}\s\[%{GREEDYDATA:thread}]%{SPACE}%{GREEDYDATA}: %{GREEDYDATA:message}"<br />    }<br />    overwrite =&gt; ["message"]<br />  }<br />  date {<br />    match =&gt; ["logdate", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601"]<br />  }<br />  json {<br />    source =&gt; "message"<br />  }<br /> }</p> <p dir="ltr"><br /> output {<br />  elasticsearch {<br />    hosts =&gt; "&lt;&lt;elastic-host&gt;&gt;"<br />    ssl =&gt; true<br />    manage_template =&gt; false<br />    index =&gt; "mulesoft-%{+YYYY.MM.dd}"<br />    user =&gt; "&lt;&lt;elastic-username&gt;&gt;"<br />    password =&gt; "&lt;&lt;elastic-password&gt;&gt;"<br />    codec =&gt; "plain"<br />  }<br /> }</p> </td> </tr></tbody></table><p>Here is AVIO Consulting's log4j2 custom log appender to ship all the application logs to a specified Amazon SQS queue. You can find this custom appender <a href="https://github.com/avioconsulting/log4j2-sqs-appender">here</a>. It is open-sourced as well under BSD 2-Clause "Simplified" License.</p> <p>This Logstash pipeline has 3 parts.</p> <ul dir="ltr"><li><strong>Input{}:</strong> This has some configuration to read a message from the specified AWS SQS queue.</li> <li><strong>Filter{}:</strong> This takes each log message from SQS queue, reads and parses it as JSON, creates appropriate fields based on the incoming JSON.</li> <li><strong>Output{}:</strong> This has the configuration to send all parsed messages to a specified destination. It should be the elastic endpoint in this</li> </ul><p>case.</p> <ul dir="ltr"></ul><p>As Logstash reads and parses the log data, elastic on the other hand stores all the data with the appropriate fields as we see below in Kibana.</p> <p dir="ltr"><img src="https://lh6.googleusercontent.com/K3H6Y1x53rENtsbo78zQOq8h7r7FMyjYH1PYkEeBs2ohY0TzJQDZVBYga3FM7uW0T8IuxO1p9uODjwgQXYA1cVcow9mCJFr47j-tiu0op8c4ktYxS8ZBAGmO-7-Em9uNefexnEMt" /></p> <p>In the above picture, you are seeing details about one log message in Kibana dashboard that is generated by our custom logger. You can also see all the JSON fields from the log message on the left pane.</p> <p>Note that the Logstash pipeline is reading the entire JSON log message from SQS queue and creates corresponding fields to each of the key-value pairs out of that incoming JSON.  When you have a dedicated field in elastic for each of the data points you send from your mule app, it is incredibly easy to create stunning dashboards and charts in Kibana.</p> <p>Now you can use Kibana to create charts and dashboards out of the data point fields in elastic for much better visualization of log messages. You can also configure your elastic instance to persist logs for an extended period of time as well as provide rollups and archiving options, things that aren’t possible in standard Cloudhub logging.</p> <p>We have now streamlined the generation of consistently structured log data from the Mule application and transported it to a highly available AWS SQS queue, where it was read and parsed by Logstash, and then sent to elasticsearch with all the fields for you to play with inside Kibana.</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <a id="comment-2299"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Kalyan Kankanala</div> </div> <div class="comment-date"> <div>December 12, 2018</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Hi Team,</p> <p>Could you please let me know what is the configuration used in log4j2.xml file . I have all the things needed from logzio and Mulesoft , however Mulesoft is throwing error LogzioAppender is not valid. Can you throw some sample .xml and pom file if any.</p> <p>Appreciate your help.</p> <p>Regards,<br /> KK</p></div> </div> </div> </div> <a id="comment-2301"></a> <div class="container blog-comments"> <div class="row"> <div class="col-sm-12"> <div class="pull-left author"> <div>Chakri Bonthala</div> </div> <div class="comment-date"> <div>December 12, 2018</div> </div> </div> </div> <div class="row"> <div class="col-sm-12 comment-body"> <div><p>Hello Kalyan,</p> <p>We have a custom appender developed by AVIO to push all the mule application logs to a highly available Amazon SQS queue and we have Logstash pipelines read messages from SQS queue and send to Kibana. So, In our log4j2.xml, we have a custom appender config for AWS SQS queue.</p></div> </div> </div> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=737&amp;2=comment_node_blog&amp;3=comment_node_blog" token="2giSD4QVq97-bVfXya9CeHDIFdH1NitylDlDDM8jgXY"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Tue, 04 Dec 2018 17:16:18 +0000 Chakri Bonthala 737 at https://www.avioconsulting.com JavaScripting in Mule 3 / 4 https://www.avioconsulting.com/blog/javascripting-mule-3-4 <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/javascripting-mule-3-4" hreflang="en">JavaScripting in Mule 3 / 4</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Overview</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Often when learning a new tool, IDE or language depending on how curious you are or how much time you have to get to play with it you get to discover many different things about it.</span></p> <p dir="ltr">This time around when learning Mulesoft a few months ago using both 3/4 Anypoint Studios I had to learn of course the basic components and once I felt comfortable with them I started using the not so common components (based on the tutorials I did).</p> <p dir="ltr">I'll talk about the experience that I had using the scripting component using the JavaScript engine and since there's no much out there (Most examples in the documentation are about Python and Groovy) I'll share with you the few key things I found useful.</p> <p dir="ltr">The following techniques apply to both Mule 3 or 4 unless I say otherwise.</p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Read the payload using the eval() JS function</span></h2> <pre> <code class="language-javascript">var payloadVar = eval('(' + payload + ')');</code></pre> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Reading the payload like this will allow you to treat it as a JavaScript object therefore use native JavaScript functions to work with objects, iterate arrays or filter them.</span></p> <p dir="ltr">For instance -&gt;</p> <pre> <code class="language-javascript">var payloadVar = eval('(' + payload + ')'); var items = payloadVar.listOfItems; var serviceItems = items.filter(function(i) {return i.itemType == 'Service'});</code></pre> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Log information through the script in the Mule console</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Pretty simple, yet not documented. You can use the log.info() function to give detailed information in the console when the script is being executed.</span></p> <p dir="ltr">Like this -&gt;</p> <pre> <code class="language-javascript">var simpleString = "simple"; log.info("Hello World"); log.info(simpleString); //"simple"</code></pre> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Returning the payload as JSON</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">It's a bit more critical in Mule 3 because if you don't return it as JSON and then you pass the payload for instance to the response of a call. It will be read as 'unexpected c'.</span></p> <p dir="ltr">In Mule 4 it's pretty much the same. The difference is that if you return the payload as it is it will be treated in the flow as a HashMap generated by the Nashorn JavaScript engine.</p> <pre> <code class="language-javascript">var payloadToReturn = { customerName: payloadVar.customerName, customerId: payloadVar.customerId, orderNumber: payloadVar.orderNumber, totalServicesCost: 23453, totalItemCost: 345, totalCost: 2798 } //mule 3 payload = JSON.stringify(payloadToReturn); //mule 4 payload = payloadToReturn; </code></pre> <p dir="ltr"> </p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">How to deal with Flow Variables</span></h2> <h3 dir="ltr">Mule 3</h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Let's say there's a set variable outside the script that sets variable1 = "I am variable 1"</span></p> <pre> <code class="language-javascript">var simpleString = flowVars.get('variable1'); log.info(simpleString); //output: "I am variable 1" flowVars.put('variable1', "I'm variable 1 changed"); log.info(flowVars.get('variable1')); //output: "I'm variable 1 changed"</code></pre> <h3 dir="ltr">Mule 4</h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Same scenario with the set variable component</span></p> <pre> <code class="language-javascript">var simpleString = vars.variable1; log.info(simpleString); //output: "I am variable 1" vars.variable1 = "changed"; //this doesn't work log.info(flowVars.get('variable1')); //output: "I'm variable 1 changed"</code></pre> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=736&amp;2=comment_node_blog&amp;3=comment_node_blog" token="7C6oGw5WX31M_hCrsGGef3MR1nFj2wyEhWfKuOvJgxk"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 21 Nov 2018 22:08:26 +0000 Alvaro Zorzini 736 at https://www.avioconsulting.com Guide to Securing Mule 4 APIs with OAuth 2.0 and Okta https://www.avioconsulting.com/blog/secure-mule-4-apis-oauth-20-and-okta <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2018-11/Okta%20MuleSoft_0.png" width="1919" height="1003" alt="Okta MuleSoft" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/secure-mule-4-apis-oauth-20-and-okta" hreflang="en">Guide to Securing Mule 4 APIs with OAuth 2.0 and Okta</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h2><meta charset="utf-8" /><b id="docs-internal-guid-5b7eef97-7fff-b5c0-e579-176b929401e7">Introduction </b></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Okta is a popular enterprise identity and access management provider, and the Anypoint API Manager enables you to govern and secure Mule APIs with a comprehensive policy library and integrated access management.  </span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">I am going to guide you through the set up of Okta as the OpenID Connect (OIDC) Identity provider for your Anypoint organization so you can use its OAuth 2.0 authorization server and access management capabilities to secure your APIs.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">OIDC is an identity layer on top of the <a href="https://oauth.net/2/">OAuth 2.0</a> protocol and I am going to cover OAuth 2.0 using the <a href="https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/">client credentials grant</a>. However, this setup will let you implement other grants and add the OIDC layer.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">According to the MuleSoft documentation, this process should work for any standard OpenID Connect Identity Provider that supports Dynamic Client Registration.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">The diagram below gives a quick overview of the OAuth dance (OAuth authorization process) used for the client credentials grant type, which is used for machine to machine applications. With this grant type, there is no user involved in the OAuth dance. In Okta, the token URL (/token) of your authorization server is used by the client application to request the access token, and the token introspection URL (/introspect) is used internally by the API Manager policy to validate the access token. We are going to review every step in detail in the following sections.</span></p> <p dir="ltr"><img alt="oauth" data-entity-type="file" data-entity-uuid="b49c96b3-8600-41a0-9327-e715a3f393ea" src="/sites/default/files/inline-images/1_0.png" /></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Prerequisites</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">There are few things that you need to make sure you have set up and signed up for before you get started:</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">A <a href="https://www.mulesoft.com/anypoint-pricing">Platinum or Titanium subscription</a>. The feature that allows integration with an OpenID Connect Identity provider is called External Identity Management</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">You need administrator privileges to the Master Organization in Anypoint Platform. If you don’t have Admin privileges, you can sign up for a trial account here: <a href="https://anypoint.mulesoft.com/login/#/signup">https://anypoint.mulesoft.com/login/#/signup</a></span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">An Okta Account. You can get an Okta Developer Account here: <a href="https://developer.okta.com/signup/">https://developer.okta.com/signup</a></span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">An API deployed, active in the API Manager, and published in Exchange</span></li> </ul><p dir="ltr"><img alt="okta" data-entity-type="file" data-entity-uuid="eec897fb-6b57-4fa0-bb1a-069e7b39167c" src="/sites/default/files/inline-images/2_0.png" /></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">What We Are Covering</span></h2> <ul dir="ltr"><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Set up Token Introspection Client app in Okta </span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Generate SSWS token in Okta.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Register Okta as an OpenID Connect Identity Provider / OAuth 2.0 Authorization Server in Anypoint Platform.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Register your API in Okta and add the client credentials grant.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Add a custom scope in Okta and assign it to your application. </span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Apply the OAuth 2.0 security policy to the Mule API.</span></li> </ul><h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Set up Token Introspection Client app n Okta</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In Okta, add a new application by going to the Applications menu on the top of the screen, click on Add Application, select Web, and click Next. In the Application Settings form, enter the application name, check the Client Credentials Grant type, and click Done. </span></p> <p dir="ltr"><img alt="image 3" data-entity-type="file" data-entity-uuid="d5ba7ec2-623c-4bf4-81e2-ee8bc3894483" src="/sites/default/files/inline-images/3.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">From the next screen, copy the Client ID and Client Secret in a notepad for later use.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">I called the application “Token Introspection Client” to match the name in the Anypoint’s Dynamic Client Registration form. This will allow Anypoint’s API Manager to validate the OAuth 2.0 access token using the information provided by Okta’s <a href="https://developer.okta.com/docs/api/resources/oidc#introspect">introspection endpoint</a>.</span></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Generate SSWS token in Okta</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In Okta, go to the API menu, select Authorization Servers, go to the Tokens tab, click Create Token, and copy the token in a notepad for later use. This is the Single Sign-On Web System (SSWS) token.    </span></p> <p dir="ltr"><img alt="image 4" data-entity-type="file" data-entity-uuid="0247e231-1b4c-42b6-9e92-15ab476eb0ac" src="/sites/default/files/inline-images/4.png" /></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Register Okta as an OpenID Connect Identity Provider / OAuth 2.0 Authorization server in Anypoint Platform</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Go to the Anypoint Platform’s menu on the left, select Access Management under Management Center, then click on External Identity.  Expand Client Management and select OpenID Connect Dynamic Client Registration.</span></p> <p dir="ltr"><img alt="image 5" data-entity-type="file" data-entity-uuid="0e35e200-a49b-4097-a070-58d7e52ffc4c" src="/sites/default/files/inline-images/5.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Fill out the Dynamic Client Registration form: </span></p> <p dir="ltr"><img alt="image 6" data-entity-type="file" data-entity-uuid="cd46485f-7647-4c58-b460-c285f1ebb1a4" src="/sites/default/files/inline-images/6.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">The Client ID and Client Secret come from the Token Introspection Client app we registered in Okta in the previous section. The Authorization Token is the SSWS we also created in the previous section, and the rest of the information comes from the authorization server metadata in Okta. </span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">To get the server’s metadata, go to Okta’s API menu and select Authorization Servers. Click on the default server (or the server you are using) and follow the metadata URI link to get the URLs needed and save the form.</span></p> <p dir="ltr"><img alt="image 7" data-entity-type="file" data-entity-uuid="cb9d0046-e8aa-4cc3-9a69-d71d473e704b" src="/sites/default/files/inline-images/7_0.png" /></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Register your API in Okta and add the client credentials grant</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Go to your API in Anypoint Exchange and from the vertical ellipses select Request Access.</span></p> <p dir="ltr"><img alt="image 8" data-entity-type="file" data-entity-uuid="2d0c2b50-7a3c-4f72-9913-96c4226afa07" src="/sites/default/files/inline-images/8_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In the Request API access window, click on Create a new application. In the Create new application form, enter your application’s name, select Authorization Code Grant because you have to select a grant (later we’ll add the Client Credentials Grant in Okta). The OAuth 2.0 redirect URI is not needed for the Client Credentials grant flow, but I added it to try the Authorization Code grant flow later. </span></p> <p dir="ltr"><img alt="image 9" data-entity-type="file" data-entity-uuid="2ff7b0a7-d7cd-42b7-b9c3-ab2ed8e856a4" src="/sites/default/files/inline-images/9_0.png" /></p> <p style="margin:11pt 0pt 0pt"><span style="line-height:200%">In the following Request API access window select the API Instance and click Request API Access. This step will create your API in Okta and will return its client id and Client secret. Copy the Client id and Client secret for later use.</span></p> <p dir="ltr"><img alt="image 10" data-entity-type="file" data-entity-uuid="e8b16c0d-6bf7-44b6-bd8c-c9af195cd574" src="/sites/default/files/inline-images/10_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In Okta, go to Applications and you will see your application listed there. Click on the application’s settings gear icon, select Assign to Groups, assign to Everyone and click Done.</span></p> <p dir="ltr"><img alt="image 11" data-entity-type="file" data-entity-uuid="e48be003-d364-4347-b577-de76782fe110" src="/sites/default/files/inline-images/11_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Then click on your application (Products API in my case), go to the General tab to display the General Settings, click on Edit, check the Client Credentials box and save it. </span></p> <h3 style="margin: 20pt 0pt 0pt;"><span style="line-height:107%">Add a custom scope in Okta and assign it to your application</span></h3> <p style="margin:1pt 0pt 0pt">In Okta, go to the API menu and select Authorization Servers, click on the link to your server, and go to the Scopes tab. Click Add Scope and fill out the form to create “myscope.” We are going to authorize this scope in the API Manager when we apply the security policy.</p> <p style="margin:10pt 0pt 0pt">Let’s note that the default access policies in Okta allow any registered app to use any scope and any grant assigned to the app to request tokens. You can add and customize access policies, but the administration of Okta is out of the scope of this blog.</p> <p dir="ltr"><img alt="image 12" data-entity-type="file" data-entity-uuid="cc52730d-1167-417a-83d0-fd02bbe2ee6e" src="/sites/default/files/inline-images/12_0.png" /></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Apply the OAuth 2.0 security policy to the Mule API</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In Anypoint, go to your API settings in the API Manager and click on Policies.</span></p> <p dir="ltr"><img alt="image 13" data-entity-type="file" data-entity-uuid="7e659f5c-feb8-48b5-8725-f1829451ada5" src="/sites/default/files/inline-images/13_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Click on Apply New Policy, in the Categories drop-down menu select Security, expand OpenId Connect access token enforcement, and select the version for your application. Click on Configure Policy.</span></p> <p dir="ltr"><img alt="image 14" data-entity-type="file" data-entity-uuid="f77bc4d6-94a1-4b10-8810-351e16b389cd" src="/sites/default/files/inline-images/14_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Add “myscope” and click Apply. The policy takes about a minute to become in effect. I am applying the policy to all the API methods and resources, but you can also apply more granular policies and even create a <a href="https://docs.mulesoft.com/api-manager/2.x/custom-policy-4-reference">custom policy</a> according to your project needs.</span></p> <p dir="ltr"><img alt="image 15" data-entity-type="file" data-entity-uuid="f7b2d5df-634f-4fc7-a60f-d9ef3d44e123" src="/sites/default/files/inline-images/15_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">The last step is to update your application’s RAML with the RAML snippet provided. </span></p> <p dir="ltr"><img alt="image 16" data-entity-type="file" data-entity-uuid="54f2b93b-bdf4-4466-aa96-ffef230c020c" src="/sites/default/files/inline-images/16_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">At this point, your API is protected. If you try to access it without a token you will get a 400 error "error": "Access token was not provided."</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">To get an access token you need to send a POST Request to Okta’s token URL (/token) provided by your server’s metadata when you filled out the dynamic registration form above. The POST request should be of content-type application/x-www-form-urlencoded, with the parameters grant_type=client_credentials and scope=myscope. Use basic authentication with your application’s client id as the user and client secret as the password.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">Now you can make a call to your API by either adding the query param access_token with the access token or sending the token as a Bearer token in the Authorization header.</span></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=733&amp;2=comment_node_blog&amp;3=comment_node_blog" token="jlRO_cTlRnCUwaG99GecbwJ1mIgPTr2SZJQgyBQ3dTA"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Thu, 15 Nov 2018 14:49:42 +0000 Miguel Martinez 733 at https://www.avioconsulting.com How to Integrate Salesforce with MuleSoft https://www.avioconsulting.com/blog/how-integrate-salesforce-mulesoft <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2018-09/MuleSoft%20plus%20SalesForce.png" width="1920" height="1080" alt="MuleSoft plus SalesForce" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/how-integrate-salesforce-mulesoft" hreflang="en">How to Integrate Salesforce with MuleSoft</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h1 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Integration Patterns:</span></h1> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Salesforce is one of the most integration-friendly products available that supports real-time, asynchronous or even batch processing. This blog discusses the various options we have for integrate with salesforce rather than how each of these to be implemented.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Outbound (Integrate Salesforce to Remote Systems):</span></h2> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Real Time:</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Integration platforms can expose a web service using the WSDL generated by Salesforce which means integration should implement salesforce interfaces. MuleSoft does provide all the tools needed for the integration.</span></p> <p><img alt="apiFlow" data-entity-type="file" data-entity-uuid="3728e00b-0fc9-4579-aaac-edccd0d530c1" src="/sites/default/files/inline-images/image%201_0.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In the test use case I choose, the implementation looks like the following</span></p> <p><img alt="Implementation" data-entity-type="file" data-entity-uuid="60858d35-14aa-4196-aa0a-d6a9a3b04072" src="/sites/default/files/inline-images/Image%202.png" /></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Near Real Time:</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">MuleSoft provided Connector can be scheduled to bring in data which makes it near real-time depending on the scheduler settings. Connector can be used to Query the Salesforce objects very much like SQL queries.</span></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Event Driven:</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Internal to Salesforce, we can define to trigger an event with defined criteria. When the action happens triggering the event, the data can be sent to integration using the integration URL. In addition to sending data to URL, Salesforce has the capability to store the data in Queue before sending it out to remote systems. This gives a much-needed reliability for the data. Queues can be configured to retry x number of times with x interval. Depending on the use case Queue can be set up for reliability either in Salesforce or an integration layer.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Inbound  (Integrate Remote Systems to Salesforce):</span></h2> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Real Time:</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">MuleSoft does provide a very robust Connector for the Salesforce to integrate which can be used for real-time updates to Salesforce.</span></p> <p><img alt="Salesforce Connector" data-entity-type="file" data-entity-uuid="ba0db125-5078-45e3-8977-26aa8904a475" src="/sites/default/files/inline-images/Image%204.png" /></p> <h3 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Bulk Data Transfer:</span></h3> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">The connector in itself provides features for the bulk data transfers. However, with bulk operations, there are chances that integration could overload Salesforce. All the bulk data transfer use case should be thoroughly tested for resource utilization.</span></p> <p><img alt="Salesforce Connector Confiuragion" data-entity-type="file" data-entity-uuid="744a5cca-2bda-43cd-9e30-b2ddd77bff20" src="/sites/default/files/inline-images/Image%205.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">There is no silver bullet on the pattern to be used, it all depends on the use case.</span></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=724&amp;2=comment_node_blog&amp;3=comment_node_blog" token="-oLlOb5u0r_e8a_gw_dCRuRYOgjHGfdq1AhTu5yqDnU"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Thu, 13 Sep 2018 19:08:35 +0000 Karthik Dega 724 at https://www.avioconsulting.com MuleSoft Anypoint Visualizer https://www.avioconsulting.com/blog/mulesoft-anypoint-visualizer <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/mulesoft-anypoint-visualizer" hreflang="en">MuleSoft Anypoint Visualizer</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p style="margin:0in 0in 8pt"> </p> <img alt="visualizer" data-entity-type="file" data-entity-uuid="7ce6edfb-fb31-438e-a278-ebbb5d85e6d4" height="62" src="/sites/default/files/inline-images/visualizer.png" width="200" class="align-center" /><p style="margin:10pt 0pt 0pt"><span style="line-height:200%">At the end of June, MuleSoft released an Anypoint Platform tool that I am so excited about, called the Anypoint Visualizer. As the name implies, the Visualizer provides visibility into your application network, giving you additional insight into your APIs, including:</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Which layer an API resides within (i.e. experience, process, system)?</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Who is using the API?</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">What are the dependencies of an API (other APIs, databases, backend systems, etc.)?</span></li> </ul><p style="margin:10pt 0pt 0pt"><span style="line-height:200%">As you build out your application network, the above details become really important, providing a better understanding of your runtime, as-built architecture. This is needed, for example, to understand dependency requirements during impact analysis; to enforce governance of layers – ensuring APIs are used correctly, or to use as a runtime dependency tool for troubleshooting purposes. </span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">Typically, on a project, I would keep track of these details in various sites including Confluence and Exchange</span></p> <ul><li style="margin: 1pt 0pt 0pt;"><span style="line-height:100%">Listing of the APIs a process API invokes</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Documenting which databases a system API invokes</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Which API a proxy API is associated with</span></li> </ul><p style="margin:1pt 0pt 0pt"><span style="line-height:200%">While helpful, it was still only consisted of static data, which is why I was ecstatic to see this type of tool now available within Anypoint Platform. With the Visualizer, the gap is now filled, documenting these inter-dependencies in real time. </span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Features of Anypoint Visualizer</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">To enable an API to be displayed within the tool, there are a just few pre-requisites (see Caveats section for details). The good news is that there are no updates required to code, just simply deploy the API. After it is deployed it will show up within the Visualizer, allowing you to categorize it into the API level:</span></p> <img alt="Mule Visualizer Features" data-entity-type="file" data-entity-uuid="9c09e788-22c4-4265-a78b-6e7ecb24593d" height="274" src="/sites/default/files/inline-images/image%201.png" width="466" class="align-center" /><p style="margin:1pt 0pt 0pt"><span style="line-height:200%">To understand the inter-dependencies, invoke the API. Connectivity lines will then be drawn between the inbound application, APIs, and backend systems, etc.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Layers</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Experience, Process, and System layers are provided OOB, but the outer layer names can be customized to denote, for example, the consumer layer or back-end system layer:</span></p> <img alt="Mule Visualizer Layers" data-entity-type="file" data-entity-uuid="a265329d-86d4-4b1b-b0aa-0be95637c85c" height="408" src="/sites/default/files/inline-images/image%202_0.png" width="852" class="align-center" /><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Application Identification</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Understanding who is using your API can be facilitated by applying the Client Id Enforcement within the API Manager. Within the Anypoint Visualizer, this attached policy will provide a visual depiction of the API consumers. In the above screenshot, you probably noticed the consumer layer has a couple of inbound connections: External Traffic and MyTestApp. External Traffic is the default name for APIs not protected by Client Id Enforcement. But for those that do have this enforcement, the Visualizer will denote the client id of the requesting application (renamed to MyTestApp in above screenshot). This allows you to understand who is using the API, along with how they are using it.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Metrics</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">CPU utilization along with memory usage is also available in the Anypoint Visualizer screen, along with a click into the link to the dashboard for a given API:</span></p> <img alt="Mule Visualizer Metrics" data-entity-type="file" data-entity-uuid="7c363fc0-c206-4470-912e-da94678574bc" height="413" src="/sites/default/files/inline-images/Image%203_0.png" width="254" class="align-center" /><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Caveats</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">As with most first releases, there are caveats that need to be considered:</span></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:100%">Only keeps history for 7 days</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Works with Mule Runtime version 3.9.1 and 4.1.3 (need to redeploy with new runtime)</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Only works for APIs deployed to CloudHub, not Mule on-premise</span></li> </ul><p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Check out this new tool in Anypoint Platform!</span></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=721&amp;2=comment_node_blog&amp;3=comment_node_blog" token="zf0YPgTaK9juPB2lsvxY3w-bnwFLxQT9TWVLQ438bXI"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Sun, 15 Jul 2018 20:49:31 +0000 Jennie DeRosa 721 at https://www.avioconsulting.com API Enablement - Learnings from the Field https://www.avioconsulting.com/blog/api-enablement-learnings-field <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/api-enablement-learnings-field" hreflang="en">API Enablement - Learnings from the Field</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Overview</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">One of the benefits of being a consultant is having the opportunity to work with a lot of different clients, many just beginning their journey with MuleSoft and API Led Enablement. In this article, I will share some of the observations and findings that I have seen that have enabled this journey to be more successful.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Understand how your APIs will be used</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Sometimes we focus so much on the data that our API serves up, that we lose sight of HOW the data will be used:</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Within the business process or mobile app that uses our APIs, what are the touch points where the data is used?</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Does the consuming application have the required fields to invoke your API? If not, this may require data enrichment, etc. adding unexpected complexity that was not considered early on.</span></li> </ul><p style="margin:1pt 0pt 0pt"><span style="line-height:200%">If your APIs are consumed by internal applications, collaborate with the developers of the mobile app, business process, etc. Don’t just throw the API over the wall to them and move on. Sit with them, understand how they are going to use it. </span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Get your APIs in front of your consumers ASAP</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Once your RAML is completed, the typical next step is to publish it to the Anypoint Exchange for review and sign off. This sign off could be done by the Product Owner who validates the RAML against the success criteria that was defined for your user story. From there, you may provide the mock endpoint to the developers creating the app that consumes your API.</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Demo the API during the sprint review meeting with live data, get feedback.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Put the alpha release out when completed, the working URL (not mock) into the hands of the developers once the sprint is completed.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Get visibility into the effort that is building out the API consumer – mobile app, business process, etc.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Iterate. Meet with the consumers on a regular basis to understand if the API is hitting the mark. This may also elicit other APIs that are needed as well.</span></li> </ul><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Know where your data lives</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Knowing where your data lives will help define the complexities of your APIs. While some may think that it resides within their enterprise databases, ERP, CRM, etc. it may be more difficult to retrieve than first thought. MuleSoft provides connectors that enable the connectivity, but must also consider the following:</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Are there multiple systems that are the source of truth for your data? If so, what is the criteria for determining where the data resides? </span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">How easy is it to get the data? Are there existing standards (i.e. only access data via stored procedures) that will increase complexity and effort?</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Will access  to the data also provide the context of the data? Or are additional business processes needed to provide context?</span></li> </ul><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Don't try to boil the ocean</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Minimal viable product (MVP) should be your mantra. Considerations include:</span></p> <ul><li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Build out only the API resources needed. Not all the resources for an API may be known before releasing it. Start with what you need, add more later as needed. </span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Implementation of a system API resource should be doable within a 2 week sprint, if not, it's too complex. Refactor.</span></li> <li style="margin:5pt 0pt 0pt"><span style="line-height:100%">Always build out your utility APIs first: notification, error/event logging, etc. that way you don’t have to go back and refactor APIs to use these core components.</span></li> </ul><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Document your RAMLs</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">While developing your RAMLs be sure to add descriptions to EVERYTHING. This includes field definitions, resources, methods and the RAML itself. The easiest way for adoption of your APIs is understanding what it does, what each of the fields are intended for. Don’t expect the field name to be self-documenting. Provide context (i.e. used in fuzzy match search) in which it is used also.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Summary</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Hopefully this has given you some food for thought as you begin your journey. Let us help! Our experience can help you be successful in your API Enablement journey.</span></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=717&amp;2=comment_node_blog&amp;3=comment_node_blog" token="LeS4zN_hc_C0T7Nxl0nJtpb_OwgmkWDL77ak6mAU2fg"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 27 Jun 2018 22:10:43 +0000 Jennie DeRosa 717 at https://www.avioconsulting.com API Migration in API Manager 2.x https://www.avioconsulting.com/blog/api-migration-api-manager-2x <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/api-migration-api-manager-2x" hreflang="en">API Migration in API Manager 2.x</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Overview</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">API Manager 2.x has support for environments which correspond to those defined within Anypoint Platform for the Runtime Manager (i.e. DEV, QA, PROD). This is an improvement over the 1.x version, which typically required the construction of version names to reflect an environment. With this enhanced functionality comes a bit of complexity during API deployment. Within the article, we will dive into the complexity as well as provide some deployment tips.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">Background</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Within API Manager 2.x, the migration lifecycle of an API starts with the RAML defined within Design Center, published to Exchange, then imported from Exchange to be managed within the API Manager. Once an API is imported into API Manager, policies can be applied, tiers defined, alerts added.</span></p> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">The Glue: Auto-Discovery</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">An API that is imported from Exchange can be paired with a deployed application, making the API 'Active' (managed). This pairing is done by specifying the following within a Mule application:</span></p> <pre> <code> &lt;api-platform-gw:api apiName="${api.name}" version="${api.version}" flowRef="my-api-main" create="true" doc:name="API Autodiscovery"/&gt;</code></pre> <p style="margin:1pt 0pt 0pt">The pairing by the apiName and version that correlate to the API Name and API Version specified in the API Manager for the given API:</p> <p><img alt="API Exchange " data-entity-type="file" data-entity-uuid="51be6bbf-d19d-4ee8-bd82-d412e5831931" src="/sites/default/files/inline-images/Image%201.png" /></p> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">You might notice that the values defined for the application name and version used within autodiscovery are a little bit different between API Manager 2.x vs. 1.x.  The new naming convention is:</span></p> <ul><li>API Version: Version + instance id</li> <li>API Name: “groupId:” + Anypoint Platform group Id + “assetId:” + RAML name</li> </ul><p style="margin:1pt 0pt 0pt"><span style="line-height:200%">After an API has been deployed, if the pairing was done correctly, the API will now be set to 'Active' status within the API Manager: </span></p> <p><img alt="API Manager" data-entity-type="file" data-entity-uuid="8cee0d64-9be5-4901-b320-45ffd0a3ca98" src="/sites/default/files/inline-images/image%202.png" /></p> <h2 style="margin:20pt 0in 0.0001pt"><span style="line-height:107%">API Migration: Cloudhub Applications</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Since the API version now contains the instance identifier, which is different in each environment, how do we go about deploying our APIs to these environments? Do we need to do it manually? Do we need to hardcode the auto-discovery properties? Do we need to apply policies in each environment? The good news is that for Cloudhub applications, the answer to all these questions is ‘no’ (see next section for on-premise applications).</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">Within API Manager, an API can be promoted from one environment to another. This allows all policies, tiers, and alerts that are defined for a given environment to be promoted up the environments. Any policies applied in lower environments will persist as they move up the environments.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">With the usage of the MuleSoft APIs available within Anypoint Platform (<a href="https://anypoint.mulesoft.com/apiplatform/anypoint-platform/#/portals">https://anypoint.mulesoft.com/apiplatform/anypoint-platform/#/portals</a>) this process can be automated, utilized from within your CI/CD pipelines during deployment, for example.</span></p> <p style="margin:10pt 0pt 0pt"><span style="line-height:200%">These APIs will allow you to query for a list of existing APIs for a given environment, promote from one environment to the next, along with retrieving the API version and name for auto-discovery:</span></p> <ul><li>Authenticate and retrieve access token (POST <a href="https://anypoint.mulesoft.com/accounts/login">https://anypoint.mulesoft.com/accounts/login</a>)</li> <li>Query for environment identifier (GET "<a href="https://anypoint.mulesoft.com/apiplatform/repository/v2/organizations/">https://anypoint.mulesoft.com/apiplatform/repository/v2/organizations/</a>" + orgId + "/environments). Environment identifiers are used in the next API calls.</li> <li>Retrieve APIs for given environment, including API version and API Name (GET "<a href="https://anypoint.mulesoft.com/apimanager/api/v1/organizations/">https://anypoint.mulesoft.com/apimanager/api/v1/organizations/</a>" + orgId + "/environments/" + envId + "/apis")</li> <li>If API does not exist in specified environment, promote it from the lower environment, i.e. DEV to QA (POST <a href="https://anypoint.mulesoft.com/apimanager/api/v1/organizations/">https://anypoint.mulesoft.com/apimanager/api/v1/organizations/</a> + groupId + ”/environments/" + toEnvId + "/apis"). POST body:</li> </ul><pre> <code>{"instanceLabel": "label", "promote": { "originApiId": lower environment API identifier, "policies": { "allEntities": true }, "tiers": { "allEntities": true }, "alerts": {"allEntities":true } } } </code></pre> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Once you retrieve the API Version and API Name, pass these values into your deployment script, as demonstrated in the next section.</span></p> <h2 style="margin:20pt 0in 0.0001pt"><span style="line-height:107%">Auto-Discovery Properties</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">In conjunction with Maven, the auto-discovery properties can be populated during deployment. Within the POM, provide placeholders for the API Name and API Version as shown below:</span></p> <pre> <code> &lt;plugin&gt; &lt;groupId&gt;org.mule.tools.maven&lt;/groupId&gt; &lt;artifactId&gt;mule-maven-plugin&lt;/artifactId&gt; &lt;version&gt;2.2.1&lt;/version&gt; &lt;configuration&gt; &lt;workerType&gt;Micro&lt;/workerType&gt; &lt;workers&gt;1&lt;/workers&gt; &lt;deploymentType&gt;cloudhub&lt;/deploymentType&gt; &lt;muleVersion&gt;${mule.version}&lt;/muleVersion&gt; &lt;username&gt;${env.deploy.username}&lt;/username&gt; &lt;password&gt;${env.deploy.password}&lt;/password&gt; &lt;redeploy&gt;true&lt;/redeploy&gt; &lt;environment&gt;${ch.env.name}&lt;/environment&gt; &lt;properties&gt; &lt;api.name&gt;${api.name}&lt;/api.name&gt; &lt;!-- Must correspond with name of API defined within API Manager, used in autodiscovery --&gt; &lt;api.version&gt;${api.version}&lt;/api.version&gt; &lt;!-- Must correspond with the version of the API defined within API Manager, used in autodiscovery --&gt; &lt;env&gt;${env}&lt;/env&gt; &lt;!-- dev, qa, or prod. Used to identify which properties file used at runtime --&gt; &lt;anypoint.platform.client_id&gt;${anypoint.platform.client_id}&lt;/anypoint.platform.client_id&gt; &lt;anypoint.platform.client_secret&gt;${anypoint.platform.client_secret}&lt;/anypoint.platform.client_secret&gt; &lt;/properties&gt; &lt;/configuration&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;deploy-cloudhub&lt;/id&gt; &lt;phase&gt;deploy&lt;/phase&gt; &lt;goals&gt; &lt;goal&gt;deploy&lt;/goal&gt; &lt;/goals&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt;</code></pre> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Now using the MuleSoft APIs, retrieve the API Name and API Version from Anypoint Platform, plugging in the values at deployment. For example:</span></p> <pre> <code>mvn clean package mule:deploy -Dapi.name=name -Dapi.version=version other params….</code></pre> <h2 style="margin:20pt 0pt 0pt"><span style="line-height:107%">API Migration: On-Premise Applications</span></h2> <p style="margin:1pt 0pt 0pt"><span style="line-height:200%">Due to a limitation with deployment parameters, on-premise deployments cannot be configured to dynamically specify the auto-discovery parameters. Given this, the APIs will be manually promoted from the API Manager Dev environment to QA, Prod, etc. In API Manager:</span></p> <p><img alt="API Manager Dev" data-entity-type="file" data-entity-uuid="203063cf-45d4-4727-b894-afaa0ca47cb8" src="/sites/default/files/inline-images/Image%203.png" /></p> <p>Select the environment and API to promote:</p> <p><img alt="Promote API" data-entity-type="file" data-entity-uuid="ac93bd36-283d-4006-b01a-f5d948db7a7f" src="/sites/default/files/inline-images/image%204_0.png" /></p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=711&amp;2=comment_node_blog&amp;3=comment_node_blog" token="eOXeZ_Psy7rqHA9nVp2oY_0FQ0pJyK1RLV4L8RJtUi0"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Tue, 26 Jun 2018 20:03:57 +0000 Jennie DeRosa 711 at https://www.avioconsulting.com UI issue in Anypoint Studio with Ubuntu https://www.avioconsulting.com/blog/ui-issue-anypoint-studio-ubuntu <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/2018-06/Untitled%20design%20%281%29.png" width="1920" height="1080" alt="Mulesoft Ubuntu" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/blog/ui-issue-anypoint-studio-ubuntu" hreflang="en">UI issue in Anypoint Studio with Ubuntu</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><h1 dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: -0.75pt;">The Problem</h1> <p>I've downloaded the latest Anypoint Studio(Version 7.1.2) to use on Ubuntu(18.04) and I wasn't able to view pop up dialog windows, for example, when clicking the Exchange button. This blocked me because of the several pop up dialogs you need to configure single components.</p> <p><img alt="Anypoint Studio Exchange Button" data-entity-type="file" data-entity-uuid="416d9c1e-0290-4f2b-a4da-e6339e8112d6" src="/sites/default/files/inline-images/sMYiqbPuU9JdB82FDNeTi5g.png" /></p> <h1> </h1> <h1>Overview</h1> <p>After doing some research, I found some people fighting this same issue (or similar) with different versions of Ubuntu and multiple versions of Anypoint Studio as well.</p> <p>After that, I ran into a topic in the Mulesoft Official Forum where a couple people solved the issue by updating the file AnypointStudio.ini to use Linux GTK (Graphic Libraries for Linux) 2.x</p> <p>BUT I realized my Anypoint was indeed using the correct GTK.</p> <h1> </h1> <h1>Solution</h1> <p>I decided to see what versions of GTK I have installed in my Linux using in the command line:</p> <ul><li>dpkg -l libgtk2.0-0 libgtk-3-0 S</li> </ul><p>and the result was:</p> <ul><li>libgtk-2-0/ 2.24.31-2ubuntu1</li> <li>Libgtk-3-0/ 3.22.25-0ubuntu0.1</li> </ul><p>By default AnypointStudio.ini file (in my case) - that is in the root folder of your Anypoint Studio installation - had</p> <p><img alt="anypointstudio.ini file" data-entity-type="file" data-entity-uuid="610cf3e1-cfe8-4a34-838a-47f2412c56dc" src="/sites/default/files/inline-images/swxepEcuNh_QtjFO7POyYYg.png" /></p> <p>so I changed it to</p> <p><img alt="anypointstudio.ini file 2" data-entity-type="file" data-entity-uuid="a0a434fb-4060-4f35-b3d8-b749515cea98" src="/sites/default/files/inline-images/sZiHIlG63kEUl1zBHXumoRg.png" /></p> <p>With this update to the .ini file and after restarting Studio, I am now able to see all of the pop-up windows!  For example the, Anypoint Exchange User Login window:</p> <p><img alt="Anypoint Exchange User Login" data-entity-type="file" data-entity-uuid="20efa124-8d94-4530-89fc-42d5c43f9a44" src="/sites/default/files/inline-images/pasted%20image%200.png" /></p> <p> </p> <p> </p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=710&amp;2=comment_node_blog&amp;3=comment_node_blog" token="-jFMRNj1eQbRlKABmZSfNJbUg2JlcJ0QSPbHg_npeNU"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Tue, 19 Jun 2018 13:40:07 +0000 Alvaro Zorzini 710 at https://www.avioconsulting.com https://www.avioconsulting.com/blog/ui-issue-anypoint-studio-ubuntu#comments AVIO Named MuleSoft Solution Partner of the Year https://www.avioconsulting.com/mulesoft-solution-partner-of-the-year <div class="avio-content"> <div class="page-title"> <div class="lead-image"> <div> <div>Blog Lead Image</div> <div> <img src="/sites/default/files/default_images/network-pen-blog-3_0.jpg" width="2000" height="1333" alt="Avio Consulting" typeof="foaf:Image" /> </div> </div> <div class="dark-overlay"></div> </div> <div class="text-overlay"> <div class="container"> <div class="row"> <div class="col-sm-12"> <div><h2> <a href="/mulesoft-solution-partner-of-the-year" hreflang="en">AVIO Named MuleSoft Solution Partner of the Year</a> </h2> </div> </div> </div> </div> </div> </div> <div class="main-content"> <div class="container"> <div class="row"> <div class="col-sm-12 node-body"> <div> <div><p>We recently received some news that got everyone here at AVIO pretty excited. <a href="https://www.mulesoft.com/">Mulesoft</a>, the provider of the Anypoint Platform we use to <a href="https://www.avioconsulting.com/technologies/mulesoft-anypoint">transform our clients’ digital business applications</a>, has named us <strong>MuleSoft Solution Partner of the Year for North America.</strong></p> <p>The select winners of the annual global MuleSoft Partner Awards were recognized at <a href="https://connect.mulesoft.com/">CONNECT 2018</a>. This is the premier conference for digital businesses, where CIOs, IT leaders, and developers come together to exchange ideas and pragmatic insights to drive business transformation.</p> <p>MuleSoft recognized us because of the way we leverage the Anypoint Platform as the cornerstone of our engagement with clients. We’re all about delivering API-led transformation and helping customers accomplish their critical business initiatives. We look at the entire way that IT and business work together, and understand how to manage and develop the needed apps with minimal downtime and maximal optimization.</p> <img alt="Anypoint" data-entity-type="file" data-entity-uuid="edb67c60-ecd3-4a9d-a4ba-57816ffcf6dc" src="/sites/default/files/inline-images/AVIO%20Award%20Blog%20Quote_0_0.png" class="align-center" /><p>While it may not be a Nobel prize or a Golden Globe award, MuleSoft’s partner awards are still a pretty big deal in the IT, consulting and apps development world that all of us inhabit. AVIO Consulting has for a long time been a <a href="https://www.mulesoft.com/partner/avio">MuleSoft Premier Partner</a>.</p> <p>AVIO’s goal is to make clients more agile and responsive to new or changing market dynamics through strategy, implementation, and managed services offerings based on the MuleSoft Anypoint Platform. When an organization is digitally optimized, the right data gets to the right person at the right time. This harmony between people and technology creates an agile, efficiently operating business able to respond and adapt quickly to digital demands and changing markets.</p> <p>This year, we were recognized for our Application Reporting and Monitoring Service (“ARMS”), which is our <a href="https://www.avioconsulting.com/solutions/avio-managed-services">managed services offering</a>.</p> <img alt="AVIO" data-entity-type="file" data-entity-uuid="acfee872-cd4c-4614-abd1-d0bbf4b34041" src="/sites/default/files/inline-images/AVIO%20Award%20Blog%20Quote_2.png" class="align-center" /><p>MuleSoft recognized us because of the way we leverage Anypoint as the cornerstone of our engagement with clients. We’re all about delivering API-led transformation and <a href="https://www.avioconsulting.com/company/case-studies">helping customers accomplish their critical business initiatives</a>. We look at the entire way that IT and business work together, and understand how to manage and develop the needed apps with minimal downtime and maximal optimization.</p> <img alt="Quote" data-entity-type="file" data-entity-uuid="d08e515c-772f-4246-a04b-b78921ec4990" src="/sites/default/files/inline-images/AVIO%20Award%20Blog%20Quote%20%281%29.png" class="align-center" /><p>AVIO’s strategy takes advantage of our deep experience with efficiently implementing app development for optimal use in growing the company’s revenues. AVIO’s process background, which focuses on big-picture business objectives, provides a more well-rounded engagement than just integrating tasks. At AVIO, we’re not just providing a service or a process. We’re also focused on the end result: how well it serves the goals of the organization. MuleSoft has been a great partner for us in achieving that, and it’s nice to know now that the feeling is mutual.</p> <p>As an authorized partner, we can also resell the Mulesoft AnyPoint Platform to simplify project planning and budgeting.</p> <p>To learn more about how AVIO and MuleSoft can transform your business through scalable digital integrations, <a href="https://www.avioconsulting.com/contact">contact us</a>.</p> </div> </div> </div> </div> </div><div class="container comment-container"> <div class="text-align-center"><h2>Join the Conversation</h2> </div> <div class="row"> <div class="col-sm-12"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=706&amp;2=comment_node_blog&amp;3=comment_node_blog" token="cKYqS98XoHtMzrmxe6gWIDmzz5SfV60gqyjHyUn0444"></drupal-render-placeholder> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-sm-12 blog-tags"> <div> <div><a href="/blog%3Fbid%3D332" hreflang="en">MuleSoft</a></div> </div> </div> </div> </div> <div><drupal-render-placeholder callback="Drupal\block\BlockViewBuilder::lazyBuilder" arguments="0=views_block__blogs_block_4&amp;1=default&amp;2=en" token="jBjf0n8iki9sjPwElNYA4B92vVETYVFMv7O9pm9FdHQ"></drupal-render-placeholder></div> <div> <div>About the Author</div> <div></div> </div> </div> </div> Wed, 09 May 2018 14:04:52 +0000 Brandon Dean 706 at https://www.avioconsulting.com