설치

$ npm install -g swagger or sudo npm install swagger
$ swagger project create swagger
$ swagger project edit

$ swagger project create swagger

? Framework? 
  connect 
  express 
  hapi 
  restify 
❯ sails 
  • express를 선택

$ swagger project edit

  • API 문서 수정

Swagger Server 에 비즈니스 로직 추가하기

function hello(req, res) {
    var name = req.swagger.params.name.value || 'stranger';
    var hello = util.format('Hello, %s!', name);
    res.json({ "message": hello });
}

Swagger Edit에서 수정

x-swagger-router-controller에 아래와 같이 추가

    paths:
        /hello:
            x-swagger-router-controller: hello_world

이슈

설치시 이슈

  • sudo를 사용했음에도 아래와 같이 에러가 발생
  • swagger-install 을 살펴보면 npm에서 -g옵션을 사용은 설정에 따라서 사용
  • $ sudo npm install swagger 해도 실패
  • xcode install & node-gyp 을 하니 정상적으로 설치가 완료
gyp ERR! stack Error: EACCES: permission denied, mkdir '/Users/direcision/.nvm/versions/node/v12.15.0/lib/node_modules/swagger/node_modules/fsevents/.node-gyp'

Swagger 시작시에 오류

  • swagger project start를 했을때 아래와 같이 에러가 발생했다.
  • github-issue를 확인해보니 nodev12에서 생기는 에러여서 node10으로 downgrade를 하던지
  • (실패) 첫번째 방법 npm install --save swagger-router을 하라고 하는구나. 이렇게 하니까 정상적으로 실행이 되는데 음...~ 이 방법으로 하면http://127.0.0.1:10010/hello?name=Scott`으로 했을때 에러가 난다. 정상적으로 수정하는 방법이 아님. 아래 방법이 좋을듯
  • (실패) 2번째 방법 또는 nodev12에서 실행하는방법
    • swagger-express-mw의 버전이 기존에는 ^0.1.0인데 ^0.7.0으로 업데이트를 하고
      • $ npm install swagger-express-mw@0.7.0
      • swagger_params_parserswagger_controllers로 추가 (config/default.yaml에`
      • 동일하게 curl http://127.0.0.1:10010/hello?name=Scott을 실행하면 Cannot read property 에러가 발생
  • (성공) 세번째 방법으로 node_modules/bagpipes/lib/fittingTypes/user.js file을 아래와 같이 변경
    • var split = err.message.split(path.sep);
    • var split = err.message.split('\n')[0].split(path.sep);
Error: Cannot find module '/Users/direcision/Desktop/ToyProjects/web/server/swagger/api/fittings/swagger_router'
Require stack:
- /Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/fittingTypes/user.js
- /Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/bagpipes.js
- /Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/index.js
- /Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/swagger-node-runner/index.js
- /Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/swagger-express-mw/lib/index.js
- /Users/direcision/Desktop/ToyProjects/web/server/swagger/app.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:793:17)
    at Function.Module._load (internal/modules/cjs/loader.js:686:27)
    at Module.require (internal/modules/cjs/loader.js:848:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at createFitting (/Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/fittingTypes/user.js:18:20)
    at Bagpipes.newFitting (/Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/bagpipes.js:158:17)
    at Bagpipes.createFitting (/Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/bagpipes.js:147:22)
    at Bagpipes.createPipe (/Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/bagpipes.js:111:19)
    at Bagpipes.getPipe (/Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/bagpipes.js:50:38)
    at /Users/direcision/Desktop/ToyProjects/web/server/swagger/node_modules/bagpipes/lib/bagpipes.js:34:10

npm install -g <packagename>을 했을때 실패를 해서 로그를 보니 아래와 같이 로그 에러가 나고 있었다.

gyp: No Xcode or CLT version detected!
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/Users/direcision/.nvm/versions/node/v12.15.0/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)
gyp ERR! stack     at ChildProcess.emit (events.js:223:5)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:272:12)
gyp ERR! System Darwin 19.3.0
gyp ERR! command "/Users/direcision/.nvm/versions/node/v12.15.0/bin/node" "/Users/direcision/.nvm/versions/node/v12.15.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/direcision/.nvm/versions/node/v12.15.0/lib/node_modules/swagger/node_modules/fsevents
gyp ERR! node -v v12.15.0
gyp ERR! node-gyp -v v5.1.0
gyp ERR! not ok
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.11 (node_modules/swagger/node_modules/fsevents):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.11 install: `node-gyp rebuild`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1

github-issue를 살펴보니 아래와 같이 설치하고 추가하니 정상적으로 설치가 된다.

following step help me to resolve this issue on Mac Catalina OS

$ sudo rm -rf $(xcode-select -print-path)
$ xcode-select --install
$ /usr/sbin/pkgutil --packages | grep CL
$ sudo npm install -g node-gyp

npm install -g <packagename>에서 가장 찝찝한건 global에 설치한다는게 너무 찝찝했다. 또 이렇게 global로 설치할때는 sudo의 권한이 필요했으니... sudo는 뭔가 찝찝 찾아보다가 npm install을 한 패키지의 내용을 계정의 root로 설치해 sudo없이 설치가 가능하다는 것이다.

$ npm set prefix ~/npm

# bash_profile
PATH=~/npm/bin:$PATH

이렇게 설정하면 npm 패키지 설치할때 sudo권한이 필요없다.

https://www.elastic.co/blog/a-practical-introduction-to-logstash

 

A Practical Introduction to Logstash

Elasticsearch에 대한 액세스 로그를 구문 분석하고 수집하기 위한 구성을 개발할 때 어떻게 Logstash를 사용할 수 있는지 보여주는 Logstash에 대한 소개.

www.elastic.co

((위의 공식 홈페이지 글을 보고 정리한 글입니다.))


logstash를 통해 es로 데이터를 수집하고 싶은데, es-logstash에 대해 간단히 살펴보자.
filebeat는 logstash module을 제공해서 filebeat로 log파일을 logstash로 쏘고, logstash에서 정제하여 es에 수집도 가능!

나는 logstash-es 부분만 일단 확인해본다.

# logstash 간단한 개요
logstash는 플러그인 기반의 데이터 수집 및 처리 엔진.
광범위한 플러그인이 구비됨 -> 다양한 아키텍처에서 손쉽게 데이터 수집,처리,전달이 가능하다.
프로세싱은 하나 이상의 파이프라인으로 구성된다.
각 파이프라인에서 하나 이상의 입력 플러그인이 내부 큐에 배치된 데이터를 수신하거나 수집한다.
  * 이 큐는 기본적으로 작아서 메모리에 보관되지만, 안정성과 복원력을 향상시키도록 디스크에서 더 크고 영구적으로 구성 가능. 

프로세싱 스레드는 마이크로 배치에 있는 큐로 부터 데이터를 읽고, 순서대로 설정된 filter plugin을 처리해준다.
logstash는 많은 수의 plugin을 제공하여 데이터를 파싱하고, 처리하고, 강화할수있게 해준다.

데이터가 처리되면 프로세싱 스레드는 데이터를 output plugin에 넣어준다. formatting하고 데이터를 계속 보내주는 역할을 하는 것이다. 가령  es 로 데이터를 보내는 것 처럼.


logstash pipeline은 한개 이상의 config파일로 생성된다.

1. 파이프라인 지정.

1)  single pipeline using a single configuration file.
     *  logstatsh를 시작하는 가장 쉬운 방법
     * -f 파라미터로  conf파일을 명시하여 실행시키는 방법.

2) single pipeline using multiple configuration files
     * 특정 directory의 모든 파일을 사용하여 설정될수도 있음.
     * logstash.yml에 기술하거나 -f 옵션으로 실행시킬수있음.
     * directory로 주어지면 그 directory의 모든 파일들을 사전식 순서로 연결한 다음 단일 구성 파일로 분석이됨.
     * 따로 conditinals를 사용해서 flow를 컨트롤하지 않는다면,
       모든 input으로부터의 데이터가 모든 filter로 처리되고, 모든 output으로 보내지게 됨.

3) using multiple pipelines
    * multiple pipelines를 사용하려면 pipeliens.yml 파일을 수정해야함.
    * multiple pipelines은 서로 다른 로직의 flow를 분리해서 복잡성을 낮추고, 많은 양의 conditionals를 사용하지 않게 함.
       * 그만큼 유지보수도 쉬워짐
    * 병렬 실행 될 것이기에 퍼포먼스도 향상됨. 효율적임.

2. 첫번째 구성 만들어보기
    * input, output은 필수, filter는 optional

input {
 file {
   path => ["/home/logstash/testdata.log"]
   sincedb_path => "/dev/null"
   start_position => "beginning"
  }
}
filter {
}
output {
  stdout {
    codec => rubydebug
  }
}

input file path를 주고, 
start_position : 시작점. one of ["beginning", "end"]
sincedb : input plugin은 현재 위치를 기록하기 위해 를 사용한다.
   * 다시말해 각각의 input file에 데이터를 계속 트레킹하기 위해 sincedb를 사용하는 것.

sincedb_path
Value type is string
There is no default value for this setting.
Path of the sincedb database file (keeps track of the current position of monitored log files) that will be written to disk. The default will write sincedb files to <path.data>/plugins/inputs/file NOTE: it must be a file path and not a directory path


   * 아래 path가서 보면 sincedb가 생성되어있음.
     그래서 es로 한번 넣었던 파일 다시 넣으니까..안되는구나

sudo cd /usr/share/logstash/data/plugins/inputs/file 
ls -al

 

stdout output plugin은 콘솔에 데이터를 쓰고, rubydebug codec은 구조를 보여줌으로써 config 개발 중에 debugging을 단순화해줌.

3. logstash 시작하기.

 logstash -r -f “/home/logstash/test.conf”

-r 옵션은 구성이 변경되었음을 식별할때마다 자동으로 구성을 다시 로드함.

{
 "message" => "Hello Logstash!",
 "@version" => "1",
 "path" => "/home/logstash/testdata.log",
 "@timestamp" => 2018-04-24T12:40:09.105Z,
 "host" => "localhost"
}

logstash에 들어간 모습. 데이터 포함하여 몇몇 메타데이터도 넣어줌.


$ yarn add @elastic/elasticsearch

github가면 예제랑 사용방법이 다 나와있음

## hot thread api
* cpu사용일이 높을때 hot threads api를 통해 특정 프로세스가 블락되어 문제를 일으키고 있는지 확인 할 수 있음.
* _nodes/hot_threads
* response 내용
   * 첫줄 : 노드의 신원 정보(스레드 정보가 어느 cpu에 속하는지에 관한 기초적 정보)
   * 둘째줄 : 'search'스레드에 xx%사용중이라고 나옴. search, merge, index와같은 행동이 기술됨.
   * 마지막줄 : es가 같은 스택트레이스를 가지고 이는 스레드가 최근 몇밀리초내에 뜬 10개 스냅샷 중 10개에 있다는 것을 의미.
   * 블락된 스레드 확인 : 블락 사용율, waiting상태에 있는 스레드들에 대한 대기 사용율.


## thread pool
* cpu와 memory의 효율적 사용을 위해 각 노드는 스레드풀을 관리하고있음.
* 요청종류에 따라 bulk/index/search thread pool이 있음.
threadpool.bulk.type:fixed
threadpool.bulk.size
threadpool.bulk.queue_size: 스레드수를 제어 (기본으로 cpu core * 5)


## 메모리
* heap크기, 필드와 필터 캐시.
* 집계와 필터에 메모리 사용.
* 필드데이터를 메모리에 올림으로써 필드데이터 접근 효율을 높임.
* 쿼리에 해당하는 문서만 올리는게 아니라 색인에 있는 모든 문서에 대한 값들을 로딩해서 쿼리가 엄청 빨라지는 것임.
* jvm ram의 50프로정도는 남겨
   * 루씬이 빈번하게 사용하는 파일 시스템 캐시를 위한 메모리 부족을 막기위해.
* 운영체제에 메모리가 부족하면 메모리페이지를 디스크로 내리는 스와핑이 발생할 수 있음. 급격한 성능저하로 이어지기때문에 스와핑은 끄도록.


## 필터와 필드 캐시
* 필터 캐시 : 필터와 쿼리 작업의 결과를 메모리내에 저장, 필터가 적용된 최초 쿼리 결과를 필터 캐시에 저장, 색인 수준으로는 사용 권장하지 않고. 노드수준의 사용을 권장 (LRU)
* 필트데이터 캐시 제한은 없음. 필드 데이터 서킷 프레이커 값에 도달까지 커질 수 있음.
* 케시 제거되는 것도 주의가 필요함. 비용이 큰 작업이고, 필드데이터가 너무 작게 설정되어있는건 아닌지 확인해볼필요가 있음.


## 운영체제 캐시
* 루씬 세그먼트는 불변 파일이고, os의 파일시스템 캐시를 적극 활용함.
  * 불변 파일이라느 것은 루씬에 의해 한번만 쓰이고, 여러번 읽힌다는 것을 의미.
* 루씬의 불변파일은 캐시 친화적. 기반이 되는 os에서 핫한 세그먼트에 빠른 접근이 가능하게 메모리에 상주시키도록 설계됨
node.tag정보를 가지고 라우팅하여 특정색인을 성능좋은 장비로 위치시킬수있음.


## 플러그인
* 사이트 플러그인, 코드 플러그인이 있음.
* 사이트 플러그인은 추가적인 기능제공은 아니고, 단순히 es가 서비스하는 웹페이지를 제공하는 것. ex) head plugin
* 코드 플러그인은 es가 실행하는 jvm코드를 포함하는 플러그인으로. jar파일. 
   * es가 인터페이스 제공을 위해 서비스 할 수 있는 기본 html, 이미지 그리고 자바스크립트 파일 포함 가능함.
   * ex) marvel plugin

$ yarn add @searchkit/refinement-autosuggest
$ yarn add @searchkit/autosuggest

Searchkit/Packages

이걸 보니까 gitbook 작성이 가능하겠다

... 너무 복잡하다 ㅠㅠ 다음에 보게되면 이어서 보자...

이 문제는 react에서 호출할때 생기는 문제로 frontend의 문제가 아닌 backend에서 처리를 해줘야 하는 에러이다.
CORS policy는 도메인이 이름이 다르거나, 뭐 포트가 다르거나 이러면 정책상 접근을 못하도록 block을 해준다.그러니 열어주면 된다.

Access to XMLHttpRequest at 'http://localhost:4000/api/aptComplex' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • cors를 설치해야하는데, express가 아닌 koa를 사용했으므로 koa에 맞는 패키지를 설치해야 한다.
  • koa-cors-github
  • 아마도 express 용으로 cors을 다운받았다면 node res.setHeader is not a function의 에러가 난다.
$ npm install @koa/cors@2 --save
const Koa = require('koa');
const cors = require('@koa/cors');

const app = new Koa();
app.use(cors());

+ Recent posts