ZUUL modify request query param

对于url路由的服务来说,可以修改context的queryParam来达到修改请求参数的目的。

package com.efivestar.springcloud.gateway.filters.demo;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.util.List;
import java.util.Map;

import static com.netflix.zuul.context.RequestContext.getCurrentContext;

/**
 * @author Spencer Gibb
 */
public class QueryParamUpdatePreFilter extends ZuulFilter {
    private final Logger log = LoggerFactory.getLogger(getClass());

    public int filterOrder() {
        // run before PreDecorationFilter
        return 5 - 1;
    }

    public String filterType() {
        return "pre";
    }

    @Override
    public boolean shouldFilter() {
        RequestContext context = getCurrentContext();
        return context.getRequest().getRequestURI().startsWith("/test/");
    }

    public Object run() {
        RequestContext ctx = getCurrentContext();
        final Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();
        if(requestQueryParams.containsKey("access_token")) {
            requestQueryParams.put("accesstoken", requestQueryParams.get("access_token"));
            requestQueryParams.remove("access_token");
            ctx.setRequestQueryParams(requestQueryParams);
        }
        return null;
    }
}

参考资料

Docker 容器里无法使用 JDK 的 jmap 等命令的问题

线上java程序出现异常,需要打印内存信息进行debug,发现没有 jmap,jstack等工具。
发现容器基础镜像选择的是FROM java:8-jre,jre环境是不包含这类工具的,遂将换成FROM java:8,这类工具便包含在内了。
使用时发现还是不能使用,出现错误 “Can’t attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted docker”

查询资料后发现:
这其实不是什么 Bug,而是 Docker 自 1.10 版本开始加入的安全特性。
类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是 Docker 自 1.10 在默认的 seccomp 配置文件中禁用了 ptrace。
相关资料

主要方法2个:
1.使用 –cap-add 明确添加指定功能:
docker run –cap-add=SYS_PTRACE …

2.Docker Compose 自 version 1.1.0 (2015-02-25) 起支持 cap_add。

version: '2'

services:
  mysql:
    ...
  api:
    ...
    cap_add:
      - SYS_PTRACE

ELK x-package watcher webhook配置

我们在配置watcher的时候,有时候期望将事件触发给自己写的服务来进行进一步的处理,这时候就需要写一些webhook了。

这里写个配置的例子。

{
"actions": {
    "test_webhook": {
      "webhook": {
        "scheme": "http",
        "host": "10.255.255.101",
        "port": 3000,
        "method": "post",
        "path": "/",
        "params": {},
        "headers": {
          "Content-Type": "application/json"
        },
        "body": "{\"text\":{{#toJson}}ctx.payload{{/toJson}},\"channel\":\"123123@chatroom\",\"username\":\"{{ctx.metadata.name}}\"}",
        "connection_timeout_in_millis": 5000,
        "read_timeout_millis": 5000
      }
    }
  }
}

参考文档