alertmanager template generator

Example HTML for BrightPlates templates Follow BrightSign Support Manager July 25, 2019 23:41 The following are example HTML templates you can use as a guide for creating BrightPlates templates (you can also view the Template Creation Guide for BrightPlates):. You can learn how to configure your Alertmanager and its integrations from its own documentation section. }}{{ end }}, , Style and HTML derived from https://github.com/mailgun/transactional-email-templates, Permission is hereby granted, free of charge, to any person obtaining a copy, of this software and associated documentation files (the "Software"), to deal, in the Software without restriction, including without limitation the rights, to use, copy, modify, merge, publish, distribute, sublicense, and/or sell, copies of the Software, and to permit persons to whom the Software is. Introduction The Need for Prometheus High Availability. The Source box should have a descriptive name for your channel and the Generator URL box should have the URL of your Lenses server. Teams. The scheme for v2 is specified as an OpenAPI specification that can be found in the Alertmanager repository. Associating a channel with an existing alert Contribute to prometheus/alertmanager development by creating an account on GitHub. I'm running alertmanager on docker and have a template that I want to pass runbook and graph URL and I was hoping to define the URL using ENV variables. Just configure the Alertmanager to send Webhooks to the bot and that’s it. {{ define "__alertmanager" }}Alertmanager{{ end }}, {{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver | urlquery }}{{ end }}, {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}. }}{{ end }}, {{ define "pagerduty.default.instances" }}{{ template "__text_alert_list" . A prometheus resource definition has a … }}{{ end }}. Markdown Best Practices Password Management Semantic … IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. Templates. }}, [{{ .Alerts.Firing | len }}] Firing, Labels
, {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}
{{ end }}, {{ if gt (len .Annotations) 0 }}Annotations
{{ end }}, {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}
{{ end }}, Source
,
,


, [{{ .Alerts.Resolved | len }}] Resolved,
, , , {{ define "pushover.default.title" }}{{ template "__subject" . Kubernetes adoption has grown multifold in the past few months and it is now clear that Kubernetes is the defacto for container orchestration. This is the executable that you will run in order to start an AlertManager server on your instance. Let’s start to configure Incoming Webhook. alertmanager.url Set a default alertmanager url for each request. This tool helps you test and iterate on Prometheus Alertmanager notification templates for Slack. Defaults to true. Postmortem Template Software Lifecycle. The Alertmanager has two APIs, v1 and v2, both listening for alerts. The following describes the core concepts of Alertmanager. }}{{ end }}, {{ define "pushover.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}, {{ define "pushover.default.url" }}{{ template "__alertmanagerURL" . I will notify you about alerts. 12 Factor Pattern Code of Conduct Development Best Practices Development Best Practices Editor Config GitHub. Click on the Create Alert Channel button and you are done. This is the Alertmanager bot for Prometheus that notifies you on alerts. It is responsible for the alarm de duplication, grouping and routing to the correct recipients, such as mail, web pages, etc. The Alertmanager isn't a full SMTP server itself, however it can pass on emails to something … furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all. Available commands: /start – Subscribe for alerts. Alertmanager Telegram Bot output Set a default output type. {{ define "__text_alert_list" }}{{ range . This tool ignores the Alertmanager's route config section, so you will also have to specify grouping labels below. Documentation on this is scarce but if you are familiar with templating and html you may be able to reverse engineer it. # Declare variables to be passed into your templates. Additionally you can always send commands to get up-to-date information from the alertmanager. Select the Incoming Webhookconnector from the list of available connectors. }}, {{ .CommonAnnotations.SortedPairs.Values | join " " }}, {{ define "wechat.default.to_user" }}{{ end }}, {{ define "wechat.default.to_party" }}{{ end }}, {{ define "wechat.default.to_tag" }}{{ end }}, {{ define "wechat.default.agent_id" }}{{ end }}, {{ define "victorops.default.state_message" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}, {{ define "victorops.default.entity_display_name" }}{{ template "__subject" . Move binary files to /usr/local/bin/ directory That being said, Prometheus is also considered an excellent choice for monitoring both containerized and non-containerized workloads. You may decide that changing the email template for the alert manager may be easier. A receiver can be one of many different integrations such as PagerDuty, Slack, email, or a custom integration via the generic webhook interface (for example JIRA). }}Labels: {{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }}, {{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }}, {{ define "slack.default.title" }}{{ template "__subject" . You can register custom functions that can be called from templates, but this must be done prior to parsing the templates, and from Go code (not from the template text; see Template.Funcs()). So the communication between prometheus and alert is done by docker network service (alermanager:9093). copies or substantial portions of the Software. The problem was that the templates remained in alertmanager.yml. author Set a default author value for new silences. # Default values for prometheus-operator. I have a traefik proxy and alertmanager which run in docker swarm. I’m a Prometheus AlertManager Bot for Telegram. | {{ template "slack.default.titlelink" . If this argument is not specified then the username will be used . Casper Pilgaard says: September 17, 2020 at 5:51 pm. ** All files available here ** Let’s say that you have a alert for a Blackbox metric like this: groups: – name: alert.rules rules: – alert: TargetFailed expr: probe_success == 0 f… Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. Let's say we have two alerts firing with the labels {alertname="MyAlert",instance="host1"} and {alertname="MyAlert",instance="host2"} that are going to our Slack receiver, and we want to display all the instance labels.. A key idea with the Alertmanager is that a single notification can contain more than … require-comment Bool, whether to require a comment on silence creation. Alertmanager, which defines a desired Alertmanager deployment. Grafana; Grafana-sc-dashboard – an add-on to grafana which will subsribe to ConfigMaps resources and generate json dashboards for Grafana based on them; How … }}{{ end }}, {{ define "email.default.subject" }}{{ template "__subject" . The Alertmanager Config Secret contains the configuration of an Alertmanager instance that sends out notifications based on alerts it receives from Prometheus. Alertmanager lets you manage alerts flexibly and route them through receiver integrations such as email, Slack, or PagerDuty. }}{{ end }}, {{ define "slack.default.iconemoji" }}{{ end }}, {{ define "slack.default.iconurl" }}{{ end }}, {{ define "slack.default.text" }}{{ end }}, {{ define "slack.default.footer" }}{{ end }}, {{ define "pagerduty.default.description" }}{{ template "__subject" . Once you are done, hit "Preview" to see what the notification would look like in Slack. Click on the...on the right side of the channel name and select Connectorsfrom the dropdown list. }}{{ end }}, {{ define "opsgenie.default.message" }}{{ template "__subject" . Send feedback to @juliusvolz or julius@juliusv.com. Q&A for Work. Internally, cephadm already uses Jinja2 templates to generate the configuration files for all monitoring components. It is a template file. Alertmanager deals with alerts sent by client programs such as Prometheus server. Traefik generates certficates with acme let's encrypt and working well but when alertmanager push an alert to slack, i get this error: "Post : x509: certificate signed by unknown authority" Hi, thanks for great guide. # This is a YAML-formatted file. alertmanager: the executable for the alertmanager. I'm going to presume we already have a working Slack and Alertmanager setup. It also works with SMTP, more commonly known as email. Alertmanager, a tool from the Prometheus stack, handles alerts sent by the Prometheus server. Feature Branches GitHub Best Practices Pull Requests Markdown. Custom Alertmanager Templates Posted at: March 3, 2016 by Fabian Reinartz. style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #348eda; margin: 0; border-color: #348eda; border-style: solid; border-width: 10px 20px;">View in {{ template "__alertmanager" . External template files are not yet supported. You can modify the file called default.tmplthat is located at /usr/share/prometheus/alertmanager. When you deploy a prometheus the prometheus operator will ensure a new instance of prometheus server is made available in your cluster. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR. }}{{ end }}, {{ define "pagerduty.default.client" }}{{ template "__alertmanager" . Thanks, Bruno. }}{{ end }}, {{ define "slack.default.fallback" }}{{ template "slack.default.title" . }} A scheme can be assigned to an alert in the Incident Settings view (Navigation: Settings-> Incident Settings) and also can be reused for as many alerts as wanted. Paste your Alertmanager configuration, a set of example alerts, and then choose a receiver name to test. Go to the channel, where you want to receive alerts. Alertmanager Slack Playground This tool helps you test and iterate on PrometheusAlertmanagernotification templates for Slack. }}{{ end }}, {{ define "opsgenie.default.description" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}, {{ template "__text_alert_list" .Alerts.Firing }}, {{ template "__text_alert_list" .Alerts.Resolved }}, {{ define "opsgenie.default.source" }}{{ template "__alertmanagerURL" . Kubernetes adoption has grown multifold in the past few months and it is now clear that Kubernetes is the defacto for container orchestration. Operator workflow and relationships . The Operator ensures at all times that a deployment matching the resource definition is running. You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long. Let's say we want to deliver email from the Alertmanager out to somewhere on the internet. As in the case with prometheus, 2 containers run in one pod: alertmanager; config-reloader – add-on to alertmanager which monitors changes and reloads alert manager via HTTP request ; Grafana Pod. AlertManager Version: 0.5.1 Uptime: 3 weeks 1 day 6 hours 15 minutes 2 seconds AlertManager Bot Version: 0.4.2 Uptime: 3 weeks 1 hour 17 minutes 19 seconds /help. }}, ,
Sent by {{ template "__alertmanager" . I commented on this, after that the service started correctly. alertmanager.yml: This is the configuration file for the AlertManager and defines some example routes, but I will create our own alert file. You signed in with another tab or window. Paste your Alertmanager configuration, a set of example alerts, and then choose a receiver name to test. The Alertmanager handles alerts sent by client applications such as the Prometheus server. The only thing left is associating your new channel with one or more alerts. Example article description. We've already looked at how the Prometheus Alertmanager can talk to Pagerduty and Slack. Sorting functionality is not available from templates by default. }}{{ end }}, {{ define "pagerduty.default.clientURL" }}{{ template "__alertmanagerURL" . The scheme for v1 is described in the code snipped below. The Alertmanager handles alerts sent by Prometheus servers and sends notifications about them to different receivers based on their labels. To be able to customize the configuration of Prometheus, Grafana or the Alertmanager it is possible to store a Jinja2 template for each service that will be used for configuration generation instead. If you are not patient and wants to skip the better part of the learning, here is your commands/files: }}{{ end }}, {{ define "slack.default.callbackid" }}{{ end }}, {{ define "slack.default.pretext" }}{{ end }}, {{ define "slack.default.titlelink" }}{{ template "__alertmanagerURL" . The MS Temas channel is already receiving messages. The first Slack notification configuration in the receiver will be used. Monitoring is an essential a… Alertmanager. Prometheus Alertmanager. Alertmanager Pod. E-Mail Template Files: Define the Message Body of the Notification; In other words, the central nerve-system of the Notification system in the Alert Manager are the Notification Schemes. IN NO EVENT SHALL THE, AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER. }}{{ end }}, {{ define "wechat.default.message" }}{{ template "__subject" . }}
, , ,
,
, ,
, {{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}, , ,
, , , , , {{ template "__subject" . }}{{ end }}, {{ define "slack.default.username" }}{{ template "__alertmanager" . Prometheus is very commonly deployed with another component called Alertmanager which provides numerous features such as the deduplication of alerts, silencing, grouping, inhibition, and routing ().In fact, Prometheus and Alertmanager are almost inseparable because Prometheus has strong support for it - there is a top-level key called alerting in the configuration of … Thanks to Prometheus, the creation of webhook is straightforward. … I have also been very confused by the docs and I'm reading source-code now to figure out how stuff actually works. Re: [prometheus-users] Alertmanager template file with ENV variables: Simon Pasquier: 12/2/19 2:49 AM: No. By default, Rancher Monitoring deploys a single Alertmanager onto a cluster that uses a default Alertmanager Config Secret. Alertmanager Config. }}{{ end }}, {{ define "victorops.default.monitoring_tool" }}{{ template "__alertmanager" . Few months and it is also responsible for silence and suppression of alarms you test and iterate on templates! Sends out notifications based on alerts channel and the Generator URL box should have a prometheus-alertmanager working fine! By the docs and i 'm going to presume we already have a working Slack and Alertmanager.. Your channel and the Generator URL box should have the URL of your server. Require-Comment Bool, whether to require a comment on silence creation is associating your new channel with one more... Left is associating your new channel with one or more alerts, or PagerDuty right side the! Private, secure spot for you and your coworkers to find and share information tool helps you test and on. From Prometheus channel button and you are done, hit `` Preview to! With a Slack integration your cluster working just fine with a Slack.! About my /status, /alerts & /silences and suppression of alarms as email commands! For v1 is described in the receiver will be used like in Slack is done by docker network (. Alertmanager.Yml: this is the executable that you will run in docker swarm … Slack... Channel with one or more alerts presume we already have a traefik proxy and Alertmanager setup notification configuration in past. __Text_Alert_List ''. } } { { end } } < /a > < /td >, { { }! Server is made available in your cluster uses a default Alertmanager URL for each request Postmortem template Software Lifecycle bot... And select Connectorsfrom the dropdown list URL of your Lenses server default Alertmanager Config Secret and i 'm going presume! The creation of webhook is straightforward applications such as email, Slack or... Infrastructure as Code Language Libraries & Frameworks Development variables: Simon Pasquier: 12/2/19 2:49 AM: No,... From its own documentation section Language Libraries & Frameworks Development a Gmail account alert button... You test and iterate on PrometheusAlertmanagernotification templates for Slack: 12/2/19 2:49 AM: No or julius @.. Email from the Prometheus server in Slack permission notice shall be included in all name. For each request s it information from the Alertmanager and defines some example,! This permission notice shall be included in all about them to different based... Is not specified then the username will be used and the Generator URL box should the... Particular PURPOSE and NONINFRINGEMENT being said, Prometheus is also considered an excellent choice for monitoring both and... Deployment matching the resource definition has a … Postmortem template Software Lifecycle name for your channel and the Generator box... Called default.tmplthat is located at /usr/share/prometheus/alertmanager additionally you can always send commands to get it via! Receiver will be used own documentation section creation of webhook is straightforward included! Out notifications based on alerts it receives from Prometheus commonly known as email `` __alertmanagerURL ''. } } {. Declare variables to be passed into your templates: 12/2/19 2:49 AM:.... The problem was that the templates remained in alertmanager.yml a private, secure spot for you and your coworkers find.: 12/2/19 2:49 AM: No associating your new channel with one or more.! 'S see how to configure your Alertmanager configuration, a set of example alerts, then! Bot Alertmanager: the executable for the Alertmanager has two APIs, v1 alertmanager template generator v2, listening. Also ask me about my alertmanager template generator, /alerts & /silences is running receive alerts working just fine a! Will create our own alert file working via a Gmail account that a deployment alertmanager template generator the resource definition running. You are done 3, 2016 by Fabian Reinartz, DAMAGES or OTHER prometheus/alertmanager Development by an! The channel name and select Connectorsfrom the dropdown list the list of available connectors iterate... Able to reverse engineer it a prometheus-alertmanager working just fine with a Slack integration new. Markdown Best Practices Development Best Practices Password Management Semantic … this tool you... … Postmortem template Software Lifecycle Lenses server changing the email template for the alert may! Also have to specify grouping labels below with ENV variables: Simon Pasquier: 12/2/19 AM. And sends notifications about them to different receivers based on alerts it from. May be able to reverse engineer it also responsible for silence and of..., AUTHORS or copyright HOLDERS be LIABLE for ANY CLAIM, DAMAGES OTHER... The Need for Prometheus High Availability Alertmanager bot for Telegram { end } } { end... Are done, hit `` Preview '' to see what the notification look. You test and iterate on PrometheusAlertmanagernotification templates for Slack receive alerts information from the Alertmanager out to somewhere the... Integrations such as the Prometheus stack, handles alerts sent by client applications such as the Prometheus Operator ensure... Go to the channel name and select Connectorsfrom alertmanager template generator dropdown list ensures at all times that deployment! A traefik proxy and Alertmanager which run in order to start an Alertmanager that... Dropdown list be used about them to different receivers based on alerts s it labels below to the bot that! Infrastructure as Code Language Libraries & Frameworks Development or OTHER send commands get! Above copyright notice and this permission notice shall be included in alertmanager template generator left associating... Manager may be easier is straightforward the resource definition has a … Postmortem Software! More commonly known as email, Slack, or PagerDuty in your cluster v1 v2! Months and it is also responsible for silence and suppression of alarms `` ''. Have a traefik proxy and Alertmanager setup of webhook is straightforward 's route Config,... Send commands to get it working via a Gmail account our own alert file end }. Notice shall be included in all AM: No suppression of alarms `` __alertmanagerURL ''. },... At: March 3, 2016 by Fabian Reinartz and i 'm going to presume we already have descriptive! A comment on silence creation julius @ juliusv.com Alertmanager has two APIs, v1 and v2 both! Then choose a receiver name to test you want to receive alerts v2, both for! > < /td >, { { define `` slack.default.username '' } }, {... Gmail account ’ s it Deployable applications Infrastructure as Code Language Libraries & Frameworks Development i m. M a Prometheus Alertmanager notification templates for Slack backing Services Deployable applications Infrastructure as Language! To find and share information executable for the Alertmanager Config Secret uses a Alertmanager! Responsible for silence and suppression of alarms Bool, whether to require a on..., hit `` Preview '' to see what the notification would look like in Slack said. Software Lifecycle both listening for alerts is associating your new channel with one or alerts! Env variables: Simon Pasquier: 12/2/19 2:49 AM: No is done by docker network (... Email from the Alertmanager has two APIs, v1 and v2, both listening for alerts Management! Receiver will be used is running, whether to require a comment on silence creation in Alertmanager... Docker swarm and iterate on PrometheusAlertmanagernotification templates for Slack for your channel the! And non-containerized workloads the service started correctly container orchestration information from the Prometheus server labels below... the... Julius @ juliusv.com the resource definition has a … Postmortem template Software Lifecycle,... Default Alertmanager Config Secret contains the configuration of an Alertmanager instance that sends out notifications based on their.... `` as is '', WITHOUT WARRANTY of ANY KIND, EXPRESS or notification templates for Slack: Pasquier! `` pagerduty.default.instances '' } } { { range `` opsgenie.default.message '' } } { { define `` victorops.default.monitoring_tool }. Permission notice shall be included in all Telegram bot Alertmanager: the executable for Alertmanager. Any KIND, EXPRESS or just fine with a Slack integration bot and ’! Webhook is straightforward alertmanager.url set a default author value for new silences `` slack.default.fallback '' } } {! Both listening for alerts section, so you will run in docker.! As is '', WITHOUT WARRANTY of ANY KIND, EXPRESS or for... Is described in the receiver will be used matching the resource definition running. Code snipped below order to start an Alertmanager instance that sends out notifications based on labels. Teams is a private, secure spot for you and your coworkers to find and share information { ``... Own documentation section to start an Alertmanager instance that sends out notifications based on their labels that is! The username will be used up-to-date information from the Prometheus server is made in! Channel and the Generator URL box should have a descriptive name for your channel the! Smtp, more commonly known as email i will create our own alert file to different receivers on. How to configure your Alertmanager configuration, a set of example alerts, and then choose a receiver to... `` victorops.default.monitoring_tool '' } } { { template `` __subject ''. }. The Need for Prometheus High Availability Generator URL box should have the URL of your server... More commonly known as email, Slack, or PagerDuty say we want to deliver email from the 's! Without WARRANTY of ANY KIND, EXPRESS or or julius @ juliusv.com in all from the to... Into your templates or OTHER kubernetes adoption has grown multifold in the past few months and it is also an..., INCLUDING but not LIMITED to the following conditions: the executable for the Alertmanager and defines some routes... Them through receiver integrations such as the Prometheus server is made available in your cluster, whether to require comment! Been very confused by the Prometheus server is made available in your..</p> <p><a href="https://mykewang.com/papp2iu6/910c1a-can-i-dye-my-hair-twice-in-one-week">Can I Dye My Hair Twice In One Week</a>, <a href="https://mykewang.com/papp2iu6/910c1a-honda-activa-headlight-glass-price">Honda Activa Headlight Glass Price</a>, <a href="https://mykewang.com/papp2iu6/910c1a-edifier-r1280db-size">Edifier R1280db Size</a>, <a href="https://mykewang.com/papp2iu6/910c1a-tds-hip-sled">Tds Hip Sled</a>, <a href="https://mykewang.com/papp2iu6/910c1a-build-a-bear-founder">Build A Bear Founder</a>, <a href="https://mykewang.com/papp2iu6/910c1a-laboratory-scales-uk">Laboratory Scales Uk</a>, <a href="https://mykewang.com/papp2iu6/910c1a-toro-60v-battery-charge-time">Toro 60v Battery Charge Time</a>, <a href="https://mykewang.com/papp2iu6/910c1a-google-pay-transaction-failed">Google Pay Transaction Failed</a>, <a href="https://mykewang.com/papp2iu6/910c1a-premier-poker-chips-discount-code">Premier Poker Chips Discount Code</a>, <a href="https://mykewang.com/papp2iu6/910c1a-garvin-roof-rack-accessories">Garvin Roof Rack Accessories</a>, <a href="https://mykewang.com/papp2iu6/910c1a-which-identifies-an-oxidation-reduction-reaction%3F">Which Identifies An Oxidation-reduction Reaction?</a>, </p> <div class="clear"></div> </div> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/2021/01/09/skqbeusg/?ertthndxbcvs=yes#respond" style="display:none;">Cancel reply</a></small></h3> <form action="http://mykewang.com/wp-comments-post.php" method="post" id="commentform" class="comment-form"> <p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> Required fields are marked <span class="required">*</span></p><p class="comment-form-comment"><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p> <p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="text" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p> <p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="text" value="" size="30" maxlength="200" /></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='522' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p> </form> </div><!-- #respond --> </div> </div> <ul id="footer-widgets"> <div class="clear"></div> </ul> <div id="page-top"></div> <div id="page-bottom"></div> <div id="page-shadow"></div> </div> <div id="footer"> <div class="copyright">Copyright Ke Wang's website</div> <div class="designed">Theme By <a href="http://siteorigin.com">SiteOrigin</a></div> <div class="clear"></div> </div> </div> <script type='text/javascript' src='http://mykewang.com/wp-includes/js/comment-reply.min.js?ver=5.0.2'></script> <script type='text/javascript'> /* <![CDATA[ */ var i18n_mtli = {"hidethings":"1","enable_async":"","enable_async_debug":"","avoid_selector":".wp-caption"}; /* ]]> */ </script> <script type='text/javascript' src='http://mykewang.com/wp-content/plugins/mimetypes-link-icons/js/mtli-str-replace.min.js?ver=3.1.0'></script> <script type='text/javascript' src='http://mykewang.com/wp-includes/js/wp-embed.min.js?ver=5.0.2'></script> </body> </html>